Merge branch '3.6-rc'
authorTobias Diekershoff <tobias.diekershoff@gmx.net>
Fri, 23 Mar 2018 07:00:37 +0000 (08:00 +0100)
committerTobias Diekershoff <tobias.diekershoff@gmx.net>
Fri, 23 Mar 2018 07:00:37 +0000 (08:00 +0100)
736 files changed:
.gitignore
.tx/config
INSTALL.txt
README.md
blackout/README.md
blackout/blackout.php
blackout/lang/it/messages.po
blockem/blockem.php
blockem/lang/C/messages.po
blockem/lang/de/messages.po
blockem/lang/de/strings.php
blockem/lang/en-gb/messages.po [new file with mode: 0644]
blockem/lang/en-gb/strings.php [new file with mode: 0644]
blockem/lang/en-us/messages.po [new file with mode: 0644]
blockem/lang/en-us/strings.php [new file with mode: 0644]
blockem/lang/it/messages.po
blockem/lang/it/strings.php
blogger/blogger.php
blogger/lang/C/messages.po
blogger/lang/ca/strings.php
blogger/lang/cs/messages.po
blogger/lang/de/messages.po
blogger/lang/de/strings.php
blogger/lang/eo/strings.php
blogger/lang/es/messages.po
blogger/lang/es/strings.php
blogger/lang/fr/messages.po
blogger/lang/fr/strings.php
blogger/lang/is/messages.po
blogger/lang/is/strings.php
blogger/lang/it/messages.po
blogger/lang/it/strings.php
blogger/lang/nb-no/strings.php
blogger/lang/pl/strings.php
blogger/lang/pt-br/messages.po
blogger/lang/pt-br/strings.php
blogger/lang/ro/messages.po
blogger/lang/ro/strings.php
blogger/lang/ru/messages.po
blogger/lang/ru/strings.php
blogger/lang/zh-cn/strings.php
buffer/README.md
buffer/buffer.php
buffer/lang/C/messages.po
buffer/lang/cs/messages.po
buffer/lang/cs/strings.php
buffer/lang/de/messages.po
buffer/lang/de/strings.php
buffer/lang/es/messages.po
buffer/lang/es/strings.php
buffer/lang/fr/messages.po
buffer/lang/fr/strings.php
buffer/lang/it/messages.po
buffer/lang/it/strings.php
buffer/lang/pt-br/messages.po
buffer/lang/pt-br/strings.php
buffer/lang/ro/messages.po
buffer/lang/ro/strings.php
buffer/lang/ru/messages.po
buffer/lang/ru/strings.php
buglink/buglink.php
buglink/lang/it/messages.po
calc/calc.php
communityhome/README.md
communityhome/communityhome.css
communityhome/communityhome.php
communityhome/lang/it/messages.po
communityhome/templates/communityhome.tpl
convert/convert.php
curweather/curweather.php
curweather/lang/it/messages.po
dav/README.md
dav/SabreDAV/ChangeLog
dav/SabreDAV/lib/Sabre/CalDAV/ICSExportPlugin.php
dav/SabreDAV/lib/Sabre/CalDAV/Notifications/Collection.php
dav/SabreDAV/lib/Sabre/CalDAV/Notifications/ICollection.php
dav/SabreDAV/lib/Sabre/CalDAV/Plugin.php
dav/SabreDAV/lib/Sabre/CalDAV/Schedule/Outbox.php
dav/SabreDAV/lib/Sabre/CardDAV/Plugin.php
dav/SabreDAV/lib/Sabre/DAV/Auth/Plugin.php
dav/SabreDAV/lib/Sabre/DAV/Browser/GuessContentType.php
dav/SabreDAV/lib/Sabre/DAV/Browser/MapGetToPropFind.php
dav/SabreDAV/lib/Sabre/DAV/Browser/Plugin.php
dav/SabreDAV/lib/Sabre/DAV/Locks/Plugin.php
dav/SabreDAV/lib/Sabre/DAV/Mount/Plugin.php
dav/SabreDAV/lib/Sabre/DAV/PartialUpdate/Plugin.php
dav/SabreDAV/lib/Sabre/DAV/Server.php
dav/SabreDAV/lib/Sabre/DAV/ServerPlugin.php
dav/SabreDAV/lib/Sabre/DAV/TemporaryFileFilterPlugin.php
dav/SabreDAV/lib/Sabre/DAVACL/Plugin.php
dav/SabreDAV/lib/Sabre/DAVACL/PrincipalBackend/PDO.php
dav/colorpicker/README.md
dav/common/calendar.fnk.php
dav/common/calendar_rendering.fnk.php
dav/common/dav_caldav_backend_private.inc.php
dav/common/dav_carddav_backend_private.inc.php
dav/common/wdcal/js/jquery.calendar.js
dav/common/wdcal_backend.inc.php
dav/common/wdcal_configuration.php
dav/common/wdcal_edit.inc.php
dav/friendica/calendar.friendica.fnk.php
dav/friendica/dav_caldav_backend_virtual_friendica.inc.php
dav/friendica/dav_carddav_backend_virtual_friendica.inc.php
dav/friendica/layout.fnk.php
dav/friendica/main.php
dav/jqueryui/jquery.ui.datepicker-de.js
dav/lang/C/messages.po
dav/lang/ca/strings.php
dav/lang/cs/messages.po
dav/lang/cs/strings.php
dav/lang/de/messages.po
dav/lang/de/strings.php
dav/lang/eo/strings.php
dav/lang/es/messages.po
dav/lang/es/strings.php
dav/lang/fr/strings.php
dav/lang/is/strings.php
dav/lang/it/messages.po
dav/lang/it/strings.php
dav/lang/nb-no/strings.php
dav/lang/pl/strings.php
dav/lang/pt-br/strings.php
dav/lang/ro/messages.po
dav/lang/ro/strings.php
dav/lang/ru/strings.php
dav/lang/zh-cn/strings.php
diaspora/diaspora.php
diaspora/lang/C/messages.po
diaspora/lang/cs/messages.po
diaspora/lang/cs/strings.php
diaspora/lang/de/messages.po
diaspora/lang/de/strings.php
diaspora/lang/es/messages.po
diaspora/lang/es/strings.php
diaspora/lang/fr/messages.po
diaspora/lang/fr/strings.php
diaspora/lang/it/messages.po
diaspora/lang/it/strings.php
diaspora/lang/pt-br/messages.po
diaspora/lang/ro/messages.po
diaspora/lang/ro/strings.php
diaspora/lang/ru/messages.po
diaspora/lang/ru/strings.php
diaspora/lang/zh-cn/messages.po
diaspora/lang/zh-cn/strings.php
dwpost/dwpost.php
dwpost/lang/C/messages.po
dwpost/lang/ca/strings.php
dwpost/lang/cs/messages.po
dwpost/lang/cs/strings.php
dwpost/lang/de/messages.po
dwpost/lang/de/strings.php
dwpost/lang/eo/strings.php
dwpost/lang/es/messages.po
dwpost/lang/es/strings.php
dwpost/lang/fr/messages.po
dwpost/lang/fr/strings.php
dwpost/lang/is/strings.php
dwpost/lang/it/messages.po
dwpost/lang/it/strings.php
dwpost/lang/nb-no/strings.php
dwpost/lang/pl/strings.php
dwpost/lang/pt-br/messages.po
dwpost/lang/pt-br/strings.php
dwpost/lang/ro/messages.po
dwpost/lang/ro/strings.php
dwpost/lang/ru/messages.po
dwpost/lang/ru/strings.php
dwpost/lang/zh-cn/strings.php
fortunate/fortunate.php
forumdirectory/forumdirectory.php
forumdirectory/lang/it/messages.po
fromapp/fromapp.php
fromapp/lang/it/messages.po
fromgplus/fromgplus.php
fromgplus/lang/it/messages.po
geocoordinates/geocoordinates.php
geonames/geonames.php
geonames/lang/C/messages.po
geonames/lang/ca/strings.php
geonames/lang/cs/messages.po
geonames/lang/cs/strings.php
geonames/lang/de/messages.po
geonames/lang/de/strings.php
geonames/lang/eo/strings.php
geonames/lang/es/messages.po
geonames/lang/es/strings.php
geonames/lang/fr/strings.php
geonames/lang/is/strings.php
geonames/lang/it/messages.po
geonames/lang/it/strings.php
geonames/lang/nb-no/strings.php
geonames/lang/pl/strings.php
geonames/lang/pt-br/strings.php
geonames/lang/ro/messages.po
geonames/lang/ro/strings.php
geonames/lang/ru/messages.po
geonames/lang/ru/strings.php
geonames/lang/zh-cn/strings.php
gnot/gnot.php
gnot/lang/C/messages.po
gnot/lang/ca/strings.php
gnot/lang/cs/messages.po
gnot/lang/cs/strings.php
gnot/lang/de/messages.po
gnot/lang/de/strings.php
gnot/lang/eo/strings.php
gnot/lang/es/messages.po
gnot/lang/es/strings.php
gnot/lang/fr/strings.php
gnot/lang/is/strings.php
gnot/lang/it/messages.po
gnot/lang/it/strings.php
gnot/lang/nb-no/strings.php
gnot/lang/pl/strings.php
gnot/lang/pt-br/strings.php
gnot/lang/ro/messages.po
gnot/lang/ro/strings.php
gnot/lang/ru/messages.po
gnot/lang/ru/strings.php
gnot/lang/zh-cn/strings.php
googlemaps/googlemaps.php
gravatar/README.md
gravatar/gravatar.php
gravatar/lang/it/messages.po
group_text/group_text.php
group_text/lang/it/messages.po
ifttt/ifttt.php
ijpost/ijpost.php
ijpost/lang/C/messages.po
ijpost/lang/ca/strings.php
ijpost/lang/cs/messages.po
ijpost/lang/cs/strings.php
ijpost/lang/de/messages.po
ijpost/lang/de/strings.php
ijpost/lang/eo/strings.php
ijpost/lang/es/messages.po
ijpost/lang/es/strings.php
ijpost/lang/fr/strings.php
ijpost/lang/is/strings.php
ijpost/lang/it/messages.po
ijpost/lang/it/strings.php
ijpost/lang/nb-no/strings.php
ijpost/lang/pl/strings.php
ijpost/lang/pt-br/messages.po
ijpost/lang/pt-br/strings.php
ijpost/lang/ro/messages.po
ijpost/lang/ro/strings.php
ijpost/lang/ru/strings.php
ijpost/lang/zh-cn/strings.php
impressum/README.md
impressum/impressum.php
impressum/lang/de/messages.po
impressum/lang/de/strings.php
impressum/lang/it/messages.po
infiniteimprobabilitydrive/infiniteimprobabilitydrive.php
infiniteimprobabilitydrive/lang/it/messages.po
irc/irc.php
irc/lang/it/messages.po
jappixmini/README
jappixmini/jappix/js/adhoc.js
jappixmini/jappix/js/anonymous.js
jappixmini/jappix/js/archives.js
jappixmini/jappix/js/connection.js
jappixmini/jappix/js/directory.js
jappixmini/jappix/js/discovery.js
jappixmini/jappix/js/favorites.js
jappixmini/jappix/js/home.js
jappixmini/jappix/js/inbox.js
jappixmini/jappix/js/integratebox.js
jappixmini/jappix/js/interface.js
jappixmini/jappix/js/jquery.js
jappixmini/jappix/js/jquery.placeholder.js
jappixmini/jappix/js/me.js
jappixmini/jappix/js/microblog.js
jappixmini/jappix/js/mini.js
jappixmini/jappix/js/mucadmin.js
jappixmini/jappix/js/music.js
jappixmini/jappix/js/notification.js
jappixmini/jappix/js/options.js
jappixmini/jappix/js/pep.js
jappixmini/jappix/js/presence.js
jappixmini/jappix/js/privacy.js
jappixmini/jappix/js/roster.js
jappixmini/jappix/js/rosterx.js
jappixmini/jappix/js/talk.js
jappixmini/jappix/js/userinfos.js
jappixmini/jappix/js/vcard.js
jappixmini/jappix/js/welcome.js
jappixmini/jappix/lang/ar/LC_MESSAGES/main.po
jappixmini/jappix/lang/bg/LC_MESSAGES/main.po
jappixmini/jappix/lang/cs/LC_MESSAGES/main.po
jappixmini/jappix/lang/de/LC_MESSAGES/main.po
jappixmini/jappix/lang/en/LC_MESSAGES/main.pot
jappixmini/jappix/lang/eo/LC_MESSAGES/main.po
jappixmini/jappix/lang/es/LC_MESSAGES/main.po
jappixmini/jappix/lang/et/LC_MESSAGES/main.po
jappixmini/jappix/lang/fa/LC_MESSAGES/main.po
jappixmini/jappix/lang/fr/LC_MESSAGES/main.po
jappixmini/jappix/lang/hu/LC_MESSAGES/main.po
jappixmini/jappix/lang/id/LC_MESSAGES/main.po
jappixmini/jappix/lang/it/LC_MESSAGES/main.po
jappixmini/jappix/lang/ja/LC_MESSAGES/main.po
jappixmini/jappix/lang/nl/LC_MESSAGES/main.po
jappixmini/jappix/lang/oc/LC_MESSAGES/main.po
jappixmini/jappix/lang/pl/LC_MESSAGES/main.po
jappixmini/jappix/lang/pt-BR/LC_MESSAGES/main.po
jappixmini/jappix/lang/ru/LC_MESSAGES/main.po
jappixmini/jappix/lang/sk/LC_MESSAGES/main.po
jappixmini/jappix/lang/sv/LC_MESSAGES/main.po
jappixmini/jappix/lang/uk/LC_MESSAGES/main.po
jappixmini/jappix/lang/zh/LC_MESSAGES/main.po
jappixmini/jappix/php/install.php
jappixmini/jappixmini.php
jappixmini/lang/it/messages.po
js_upload/file-uploader/readme.md
js_upload/js_upload.php
js_upload/lang/it/messages.po
krynn/krynn.php
krynn/lang/C/messages.po
krynn/lang/ca/strings.php
krynn/lang/cs/messages.po
krynn/lang/cs/strings.php
krynn/lang/de/messages.po
krynn/lang/de/strings.php
krynn/lang/eo/strings.php
krynn/lang/es/messages.po
krynn/lang/es/strings.php
krynn/lang/fr/strings.php
krynn/lang/is/strings.php
krynn/lang/it/messages.po
krynn/lang/it/strings.php
krynn/lang/nb-no/strings.php
krynn/lang/pl/strings.php
krynn/lang/pt-br/strings.php
krynn/lang/ro/messages.po
krynn/lang/ro/strings.php
krynn/lang/ru/strings.php
krynn/lang/zh-cn/strings.php
langfilter/lang/it/messages.po
langfilter/lang/nl/messages.po [new file with mode: 0644]
langfilter/lang/nl/strings.php [new file with mode: 0644]
langfilter/lang/zh-cn/messages.po [new file with mode: 0644]
langfilter/lang/zh-cn/strings.php [new file with mode: 0644]
langfilter/langfilter.php
ldapauth/ldapauth.php
leistungsschutzrecht/leistungsschutzrecht.php
libertree/lang/C/messages.po
libertree/lang/ca/strings.php
libertree/lang/cs/messages.po
libertree/lang/cs/strings.php
libertree/lang/de/messages.po
libertree/lang/de/strings.php
libertree/lang/eo/strings.php
libertree/lang/es/messages.po
libertree/lang/es/strings.php
libertree/lang/fr/messages.po
libertree/lang/fr/strings.php
libertree/lang/is/strings.php
libertree/lang/it/messages.po
libertree/lang/it/strings.php
libertree/lang/nb-no/strings.php
libertree/lang/pl/strings.php
libertree/lang/pt-br/messages.po
libertree/lang/pt-br/strings.php
libertree/lang/ro/messages.po
libertree/lang/ro/strings.php
libertree/lang/ru/strings.php
libertree/lang/zh-cn/strings.php
libertree/libertree.php
libravatar/README.md
libravatar/lang/it/messages.po
libravatar/libravatar.php
ljpost/lang/C/messages.po
ljpost/lang/ca/strings.php
ljpost/lang/cs/messages.po
ljpost/lang/cs/strings.php
ljpost/lang/de/messages.po
ljpost/lang/de/strings.php
ljpost/lang/eo/strings.php
ljpost/lang/es/messages.po
ljpost/lang/es/strings.php
ljpost/lang/fr/strings.php
ljpost/lang/is/strings.php
ljpost/lang/it/messages.po
ljpost/lang/it/strings.php
ljpost/lang/nb-no/strings.php
ljpost/lang/pl/strings.php
ljpost/lang/pt-br/messages.po
ljpost/lang/pt-br/strings.php
ljpost/lang/ro/messages.po
ljpost/lang/ro/strings.php
ljpost/lang/ru/strings.php
ljpost/lang/zh-cn/strings.php
ljpost/ljpost.php
mahjongg/mahjongg.php
mailstream/lang/C/messages.po
mailstream/lang/de/messages.po
mailstream/lang/de/strings.php
mailstream/lang/it/messages.po
mailstream/lang/it/strings.php
mailstream/mailstream.php
mailstream/phpmailer/class.phpmailer.php
mailstream/templates/settings.tpl
mathjax/lang/it/messages.po
mathjax/lang/it/strings.php
mathjax/lang/zh-cn/messages.po [new file with mode: 0644]
mathjax/lang/zh-cn/strings.php
mathjax/mathjax.php
membersince/membersince.php
morechoice/morechoice.php
morepokes/lang/it/messages.po
morepokes/morepokes.php
namethingy/namethingy.php
newmemberwidget/lang/it/messages.po
newmemberwidget/newmemberwidget.php
notifyall/notifyall.php
notimeline/lang/it/messages.po
notimeline/notimeline.php
nsfw/README
nsfw/lang/C/messages.po
nsfw/lang/ca/strings.php
nsfw/lang/cs/messages.po
nsfw/lang/cs/strings.php
nsfw/lang/de/messages.po
nsfw/lang/de/strings.php
nsfw/lang/en-gb/messages.po [new file with mode: 0644]
nsfw/lang/en-gb/strings.php [new file with mode: 0644]
nsfw/lang/en-us/messages.po [new file with mode: 0644]
nsfw/lang/en-us/strings.php [new file with mode: 0644]
nsfw/lang/eo/strings.php
nsfw/lang/es/messages.po
nsfw/lang/es/strings.php
nsfw/lang/fr/strings.php
nsfw/lang/is/strings.php
nsfw/lang/it/messages.po
nsfw/lang/it/strings.php
nsfw/lang/nb-no/strings.php
nsfw/lang/pl/strings.php
nsfw/lang/pt-br/messages.po
nsfw/lang/pt-br/strings.php
nsfw/lang/ro/messages.po
nsfw/lang/ro/strings.php
nsfw/lang/ru/strings.php
nsfw/lang/zh-cn/strings.php
nsfw/nsfw.php
numfriends/lang/it/messages.po
numfriends/numfriends.php
openstreetmap/README
openstreetmap/lang/it/messages.po
openstreetmap/openstreetmap.php
openstreetmap/templates/admin.tpl
pageheader/README
pageheader/lang/C/messages.po
pageheader/lang/de/messages.po
pageheader/lang/de/strings.php
pageheader/lang/it/messages.po
pageheader/lang/it/strings.php
pageheader/pageheader.php
pageheader/templates/settings.tpl [new file with mode: 0644]
piwik/README.md
piwik/lang/it/messages.po
piwik/lang/zh-cn/messages.po [new file with mode: 0644]
piwik/lang/zh-cn/strings.php
piwik/piwik.php
planets/lang/C/messages.po
planets/lang/ca/strings.php
planets/lang/cs/messages.po
planets/lang/cs/strings.php
planets/lang/de/messages.po
planets/lang/de/strings.php
planets/lang/eo/strings.php
planets/lang/es/messages.po
planets/lang/es/strings.php
planets/lang/fr/strings.php
planets/lang/is/strings.php
planets/lang/it/messages.po
planets/lang/it/strings.php
planets/lang/nb-no/strings.php
planets/lang/pl/strings.php
planets/lang/pt-br/strings.php
planets/lang/ro/messages.po
planets/lang/ro/strings.php
planets/lang/ru/strings.php
planets/lang/zh-cn/strings.php
planets/planets.php
pledgie/pledgie.php
public_server/README.md
public_server/lang/it/messages.po
public_server/public_server.php
pumpio/lang/C/messages.po
pumpio/lang/cs/messages.po
pumpio/lang/cs/strings.php
pumpio/lang/de/messages.po
pumpio/lang/de/strings.php
pumpio/lang/es/messages.po
pumpio/lang/es/strings.php
pumpio/lang/fr/messages.po
pumpio/lang/fr/strings.php
pumpio/lang/it/messages.po
pumpio/lang/it/strings.php
pumpio/lang/pt-br/messages.po
pumpio/lang/pt-br/strings.php
pumpio/lang/ro/messages.po
pumpio/lang/ro/strings.php
pumpio/pumpio.php
qcomment/lang/it/messages.po
qcomment/qcomment.php
randplace/lang/C/messages.po
randplace/lang/ca/strings.php
randplace/lang/cs/messages.po
randplace/lang/cs/strings.php
randplace/lang/de/messages.po
randplace/lang/de/strings.php
randplace/lang/eo/strings.php
randplace/lang/es/messages.po
randplace/lang/es/strings.php
randplace/lang/fr/strings.php
randplace/lang/is/strings.php
randplace/lang/it/messages.po
randplace/lang/it/strings.php
randplace/lang/nb-no/strings.php
randplace/lang/pl/strings.php
randplace/lang/pt-br/strings.php
randplace/lang/ro/messages.po
randplace/lang/ro/strings.php
randplace/lang/ru/strings.php
randplace/lang/sv/strings.php
randplace/lang/zh-cn/strings.php
randplace/randplace.php
remote_permissions/README.md
remote_permissions/lang/it/messages.po
remote_permissions/remote_permissions.php
rendertime/lang/it/messages.po
rendertime/rendertime.php
securemail/lang/de/messages.po [new file with mode: 0644]
securemail/lang/de/strings.php [new file with mode: 0644]
securemail/lang/it/messages.po [new file with mode: 0644]
securemail/lang/it/strings.php [new file with mode: 0644]
securemail/securemail.php
showmore/lang/it/messages.po
showmore/showmore.php
smiley_pack/lang/smiley_pack_es/smiley_pack_es.php
smiley_pack/lang/smiley_pack_fr/smiley_pack_fr.php
smiley_pack/smiley_pack.php
smileybutton/lang/it/messages.po
smileybutton/smileybutton.php
smilies_adult/smilies_adult.php
sniper/sniper.php
startpage/lang/it/messages.po
startpage/startpage.php
statusnet/README.md
statusnet/codebird.php [deleted file]
statusnet/lang/it/messages.po
statusnet/library/codebirdsn.php [new file with mode: 0644]
statusnet/library/statusnetoauth.php [new file with mode: 0644]
statusnet/library/twitteroauth.php [new file with mode: 0644]
statusnet/statusnet.php
superblock/lang/it/messages.po
superblock/lang/it/strings.php
superblock/superblock.php
testdrive/README.md
testdrive/lang/it/messages.po
testdrive/testdrive.php
tictac/lang/it/messages.po
tictac/tictac.php
tumblr/README.md
tumblr/lang/C/messages.po
tumblr/lang/ca/strings.php
tumblr/lang/cs/messages.po
tumblr/lang/cs/strings.php
tumblr/lang/de/messages.po
tumblr/lang/de/strings.php
tumblr/lang/eo/strings.php
tumblr/lang/es/messages.po
tumblr/lang/es/strings.php
tumblr/lang/fr/strings.php
tumblr/lang/is/strings.php
tumblr/lang/it/messages.po
tumblr/lang/it/strings.php
tumblr/lang/nb-no/strings.php
tumblr/lang/pl/strings.php
tumblr/lang/pt-br/messages.po
tumblr/lang/pt-br/strings.php
tumblr/lang/ro/messages.po
tumblr/lang/ro/strings.php
tumblr/lang/ru/strings.php
tumblr/lang/zh-cn/strings.php
tumblr/library/tumblroauth.php [new file with mode: 0644]
tumblr/tumblr.php
tumblr/tumblroauth/OAuth.php [deleted file]
tumblr/tumblroauth/tumblroauth.php [deleted file]
twitter/LICENSE
twitter/README.md
twitter/cacert.pem [deleted file]
twitter/codebird.php [deleted file]
twitter/composer.json [new file with mode: 0644]
twitter/composer.lock [new file with mode: 0644]
twitter/lang/C/messages.po
twitter/lang/ca/strings.php
twitter/lang/cs/messages.po
twitter/lang/cs/strings.php
twitter/lang/de/messages.po
twitter/lang/de/strings.php
twitter/lang/eo/strings.php
twitter/lang/es/messages.po
twitter/lang/es/strings.php
twitter/lang/fr/messages.po
twitter/lang/fr/strings.php
twitter/lang/is/strings.php
twitter/lang/it/messages.po
twitter/lang/it/strings.php
twitter/lang/nb-no/strings.php
twitter/lang/pl/strings.php
twitter/lang/pt-br/messages.po
twitter/lang/pt-br/strings.php
twitter/lang/ro/messages.po
twitter/lang/ro/strings.php
twitter/lang/ru/messages.po
twitter/lang/ru/strings.php
twitter/lang/sv/strings.php
twitter/lang/zh-cn/strings.php
twitter/twitter.php
twitter/twitter_sync.php
twitter/vendor/abraham/twitteroauth/.gitignore [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/.travis.yml [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/CODE_OF_CONDUCT.md [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/LICENSE.md [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/README.md [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/autoload.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/composer.json [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/phpmd.xml [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/phpunit.xml [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/src/Config.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/src/Consumer.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/src/HmacSha1.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/src/Request.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/src/Response.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/src/SignatureMethod.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/src/Token.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/src/TwitterOAuth.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/src/TwitterOAuthException.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/src/Util.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/src/Util/JsonDecoder.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/src/cacert.pem [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/tests/AbstractSignatureMethodTest.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/tests/ConsumerTest.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/tests/HmacSha1Test.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/tests/TokenTest.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/tests/TwitterOAuthTest.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/tests/Util/JsonDecoderTest.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/tests/bootstrap.php [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/tests/kitten.jpg [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/tests/sample_env [new file with mode: 0644]
twitter/vendor/abraham/twitteroauth/tests/video.mp4 [new file with mode: 0644]
twitter/vendor/autoload.php [new file with mode: 0644]
twitter/vendor/composer/ClassLoader.php [new file with mode: 0644]
twitter/vendor/composer/LICENSE [new file with mode: 0644]
twitter/vendor/composer/autoload_classmap.php [new file with mode: 0644]
twitter/vendor/composer/autoload_namespaces.php [new file with mode: 0644]
twitter/vendor/composer/autoload_psr4.php [new file with mode: 0644]
twitter/vendor/composer/autoload_real.php [new file with mode: 0644]
twitter/vendor/composer/autoload_static.php [new file with mode: 0644]
twitter/vendor/composer/installed.json [new file with mode: 0644]
unicode_smilies/unicode_smilies.php
viewsrc/lang/it/messages.po [new file with mode: 0644]
viewsrc/lang/it/strings.php
viewsrc/viewsrc.php
webrtc/README.md
webrtc/lang/it/messages.po
webrtc/webrtc.php
widgets/lang/C/messages.po
widgets/lang/ca/strings.php
widgets/lang/cs/strings.php
widgets/lang/de/strings.php
widgets/lang/eo/strings.php
widgets/lang/es/strings.php
widgets/lang/fr/strings.php
widgets/lang/is/strings.php
widgets/lang/it/strings.php
widgets/lang/nb-no/strings.php
widgets/lang/pl/strings.php
widgets/lang/pt-br/strings.php
widgets/lang/ru/strings.php
widgets/lang/sv/strings.php
widgets/lang/zh-cn/strings.php
widgets/widget_friendheader.php
widgets/widget_friends.php
widgets/widget_like.php
widgets/widgets.php
windowsphonepush/lang/C/messages.po
windowsphonepush/lang/de/messages.po
windowsphonepush/lang/de/strings.php
windowsphonepush/lang/es/messages.po
windowsphonepush/lang/es/strings.php
windowsphonepush/lang/fr/messages.po
windowsphonepush/lang/fr/strings.php
windowsphonepush/lang/it/messages.po
windowsphonepush/lang/it/strings.php
windowsphonepush/lang/ro/messages.po
windowsphonepush/lang/ro/strings.php
windowsphonepush/windowsphonepush.php
wppost/lang/C/messages.po
wppost/lang/ca/strings.php
wppost/lang/cs/messages.po
wppost/lang/cs/strings.php
wppost/lang/de/messages.po
wppost/lang/de/strings.php
wppost/lang/eo/strings.php
wppost/lang/es/messages.po
wppost/lang/es/strings.php
wppost/lang/fr/strings.php
wppost/lang/is/strings.php
wppost/lang/it/messages.po
wppost/lang/it/strings.php
wppost/lang/nb-no/strings.php
wppost/lang/pl/strings.php
wppost/lang/pt-br/messages.po
wppost/lang/pt-br/strings.php
wppost/lang/ro/messages.po
wppost/lang/ro/strings.php
wppost/lang/ru/strings.php
wppost/lang/zh-cn/strings.php
wppost/wppost.php
xmpp/converse/README.rst
xmpp/converse/builds/converse.min.js
xmpp/lang/it/messages.po [new file with mode: 0644]
xmpp/lang/it/strings.php [new file with mode: 0644]
xmpp/lang/nl/messages.po [new file with mode: 0644]
xmpp/lang/nl/strings.php [new file with mode: 0644]
xmpp/xmpp.php
yourls/README
yourls/lang/it/messages.po
yourls/lang/nl/messages.po [new file with mode: 0644]
yourls/lang/nl/strings.php [new file with mode: 0644]
yourls/yourls.php

index 39340a425ee8cde5a3516ab2a519d7bcb01ab9bf..36ccc906e56c08e141dbabf5df1e7b31b120524c 100644 (file)
@@ -15,7 +15,7 @@ report/
 .buildpath\r
 .externalToolBuilders\r
 .settings\r
-#ignore OSX .DS_Store files \r
+#ignore OSX .DS_Store files\r
 .DS_Store\r
 \r
 /nbproject/private/\r
index 50b8ef45b6530e2b4b4536ad0c21264ae7e8022a..599edaee8adfcc15e767479de26219a4972d28f9 100644 (file)
@@ -1,12 +1,6 @@
 [main]
 host = https://www.transifex.com
 
-[friendica.addon_appnet_messagespo]
-file_filter = appnet/lang/<lang>/messages.po
-source_file = appnet/lang/C/messages.po
-source_lang = en
-type = PO
-
 [friendica.addon_blackout_messagespo]
 file_filter = blackout/lang/<lang>/messages.po
 source_file = blackout/lang/C/messages.po
@@ -37,12 +31,6 @@ source_file = buglink/lang/C/messages.po
 source_lang = en
 type = PO
 
-[friendica.addon_cal_messagespo]
-file_filter = cal/lang/<lang>/messages.po
-source_file = cal/lang/C/messages.po
-source_lang = en
-type = PO
-
 [friendica.addon_communityhome_messagespo]
 file_filter = communityhome/lang/<lang>/messages.po
 source_file = communityhome/lang/C/messages.po
@@ -73,24 +61,12 @@ source_file = dwpost/lang/C/messages.po
 source_lang = en
 type = PO
 
-[friendica.addon_editplain_messagespo]
-file_filter = editplain/lang/<lang>/messages.po
-source_file = editplain/lang/C/messages.po
-source_lang = en
-type = PO
-
 [friendica.addon_forumdirectory_messagespo]
 file_filter = forumdirectory/lang/<lang>/messages.po
 source_file = forumdirectory/lang/C/messages.po
 source_lang = en
 type = PO
 
-[friendica.addon_forumlist_messagespo]
-file_filter = forumlist/lang/<lang>/messages.po
-source_file = forumlist/lang/C/messages.po
-source_lang = en
-type = PO
-
 [friendica.addon_fromapp_messagespo]
 file_filter = fromapp/lang/<lang>/messages.po
 source_file = fromapp/lang/C/messages.po
@@ -115,12 +91,6 @@ source_file = gnot/lang/C/messages.po
 source_lang = en
 type = PO
 
-[friendica.addon_gpluspost_messagespo]
-file_filter = gpluspost/lang/<lang>/messages.po
-source_file = gpluspost/lang/C/messages.po
-source_lang = en
-type = PO
-
 [friendica.addon_gravatar_messagespo]
 file_filter = gravatar/lang/<lang>/messages.po
 source_file = gravatar/lang/C/messages.po
@@ -301,6 +271,12 @@ source_file = rendertime/lang/C/messages.po
 source_lang = en
 type = PO
 
+[friendica.addon_securemail_messagespo]
+file_filter = securemail/lang/<lang>/messages.po
+source_file = securemail/lang/C/messages.po
+source_lang = en
+type = PO
+
 [friendica.addon_showmore_messagespo]
 file_filter = showmore/lang/<lang>/messages.po
 source_file = showmore/lang/C/messages.po
@@ -313,12 +289,6 @@ source_file = smileybutton/lang/C/messages.po
 source_lang = en
 type = PO
 
-[friendica.addon_snautofollow_messagespo]
-file_filter = snautofollow/lang/<lang>/messages.po
-source_file = snautofollow/lang/C/messages.po
-source_lang = en
-type = PO
-
 [friendica.addon_startpage_messagespo]
 file_filter = startpage/lang/<lang>/messages.po
 source_file = startpage/lang/C/messages.po
@@ -361,9 +331,9 @@ source_file = twitter/lang/C/messages.po
 source_lang = en
 type = PO
 
-[friendica.addon_uhremotestorage_messagespo]
-file_filter = uhremotestorage/lang/<lang>/messages.po
-source_file = uhremotestorage/lang/C/messages.po
+[friendica.addon_viewsrc_messagespo]
+file_filter = viewsrc/lang/<lang>/messages.po
+source_file = viewsrc/lang/C/messages.po
 source_lang = en
 type = PO
 
@@ -385,6 +355,12 @@ source_file = wppost/lang/C/messages.po
 source_lang = en
 type = PO
 
+[friendica.addon_xmpp_messagespo]
+file_filter = xmpp/lang/<lang>/messages.po
+source_file = xmpp/lang/C/messages.po
+source_lang = en
+type = PO
+
 [friendica.addon_yourls_messagespo]
 file_filter = yourls/lang/<lang>/messages.po
 source_file = yourls/lang/C/messages.po
index f45e86b80115836c1546a2666d3c90eae9ab2d7c..8b248bd010465233592cfecaa955de994eea73ef 100644 (file)
@@ -4,9 +4,10 @@
 
 To install all addons using git, cd into your top level Friendica directory and
 
-git clone https://github.com/friendica/friendica-addons.git addon
+       git clone https://github.com/friendica/friendica-addons.git addon
+       util/composer.phar install -d addon
 
-This will clone the entire repository in a directory called addon.  They can now be activated in the plugins section of your admin panel.
+This will clone the entire repository in a directory called addon. They can now be activated in the addons section of your admin panel.
 
 ********************
 * Install Manually *
@@ -15,4 +16,4 @@ This will clone the entire repository in a directory called addon.  They can now
 1. Download the archive (Download ZIP button) containing the addons.
 2. Unzip the contents of the archive to your harddrive.
 3. Upload the extracted directory and all it's contents to /path/to/friendica/addon.  You will need to create the addon directory if this is the first addon you have installed.
-4. Activate the addon in the plugins section of your admin panel.
+4. Activate the addon in the addons section of your admin panel.
index 52fdbb2e074d6f5118d594c9e37f7bdc685ac5a5..deffa2a54f249be0edbe1be066a233844e0fbc89 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,8 +1,8 @@
 Addons for Friendica
 ====================
 
-This repository is a collection of plugins for the [Friendica Social Communications Server](https://github.com/friendica/friendica).
-You can add these plugins to the /addon directory of your Friendica installation
+This repository is a collection of addons for the [Friendica Social Communications Server](https://github.com/friendica/friendica).
+You can add these addons to the /addon directory of your Friendica installation
 do extend the functionality of your node.
 
 After uploading the addons to your server, you need to activate the desired addons
@@ -14,7 +14,7 @@ in cases the addon developers have choosen not to include them here.
 Connectors
 ----------
 
-Among these plugins there are also the [connectors](https://github.com/friendica/friendica/blob/master/doc/Connectors.md) for various other networks
+Among these addons there are also the [connectors](https://github.com/friendica/friendica/blob/master/doc/Connectors.md) for various other networks
 (e.g. Twitter, pump.io, Google+) that are needed for communication when the
 protocoll is not supported by Friendica core (DFRN, OStatus and Diaspora).
 
@@ -28,7 +28,7 @@ Development
 
 The addon interface of Friendica is very flexible and powerful, so if you are
 missing functionality, your chances are high it may be added with an addon.
-See the [documentation](https://github.com/friendica/friendica/blob/master/doc/Plugins.md) for more informations on the plugin development.
+See the [documentation](https://github.com/friendica/friendica/blob/master/doc/Addons.md) for more informations on the addon development.
 
 Addons can be translated like any other part of Friendica. Translations for the
 addons included in this repository are done at the [Transifex project](https://www.transifex.com/projects/p/friendica/) for Friendica.
index 1974ef7b0f384240f12390c5cbaef5a2389e3820..1bf536ca1261f30007ca6a9e3104f8b32e301e20 100644 (file)
@@ -8,12 +8,12 @@ blackout addon
 About
 -----
 
-This plugin will allow you to enter a date/time period during which
+This addon will allow you to enter a date/time period during which
 all your ~friendica visitors from the web will be redirected to a page
 you can configure in the admin panel as well.
 
 Calls to the API and the communication with other ~friendica nodes is
-not effected from this plugin.
+not effected from this addon.
 
 If you enter a period the current date would be affected none of the
 currently logged in users will be effected as well. But if they log
index 3678969e340e7f689f522acfeab1946525657fb8..ec7215ab22dce5ed5810923c17a2eac8a6ac5818 100644 (file)
@@ -9,12 +9,12 @@
  * About
  * =====
  *
- * This plugin will allow you to enter a date/time period during which
+ * This addon will allow you to enter a date/time period during which
  * all your ~friendica visitors from the web will be redirected to a page
  * you can configure in the admin panel as well.
  *
  * Calls to the API and the communication with other ~friendica nodes is
- * not effected from this plugin.
+ * not effected from this addon.
  *
  * If you enter a period the current date would be affected none of the
  * currently logged in users will be effected as well. But if they log
  * THE SOFTWARE.
  */
 
+use Friendica\Core\Config;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
 
 function blackout_install() {
-    register_hook('page_header', 'addon/blackout/blackout.php', 'blackout_redirect');
+    Addon::registerHook('page_header', 'addon/blackout/blackout.php', 'blackout_redirect');
 }
 
 function blackout_uninstall() {
-    unregister_hook('page_header', 'addon/blackout/blackout.php', 'blackout_redirect');
+    Addon::unregisterHook('page_header', 'addon/blackout/blackout.php', 'blackout_redirect');
 }
 function blackout_redirect ($a, $b) {
     // if we have a logged in user, don't throw her out
@@ -86,20 +89,20 @@ function blackout_redirect ($a, $b) {
     }
 }
 
-function blackout_plugin_admin(&$a, &$o) {
-    $mystart = get_config('blackout','begindate');
+function blackout_addon_admin(&$a, &$o) {
+    $mystart = Config::get('blackout','begindate');
     if (! is_string($mystart)) { $mystart = "YYYY-MM-DD:hhmm"; }
     $myend   = get_config('blackout','enddate');
     if (! is_string($myend)) { $myend = "YYYY-MM-DD:hhmm"; }
     $myurl   = get_config('blackout','url');
     if (! is_string($myurl)) { $myurl = "http://www.example.com"; }
     $t = get_markup_template( "admin.tpl", "addon/blackout/" );
-   $o = replace_macros($t, array(
-        '$submit' => t('Save Settings'),
-        '$rurl' => array("rurl", "Redirect URL", $myurl, "all your visitors from the web will be redirected to this URL"),
-        '$startdate' => array("startdate", "Begin of the Blackout<br />(YYYY-MM-DD hh:mm)", $mystart, "format is <em>YYYY</em> year, <em>MM</em> month, <em>DD</em> day, <em>hh</em> hour and <em>mm</em> minute"),
-        '$enddate' => array("enddate", "End of the Blackout<br />(YYYY-MM-DD hh:mm)", $myend, ""),
+
+   $o = replace_macros($t, [
+        '$submit' => L10n::t('Save Settings'),
+        '$rurl' => ["rurl", "Redirect URL", $myurl, "all your visitors from the web will be redirected to this URL"],
+        '$startdate' => ["startdate", "Begin of the Blackout<br />(YYYY-MM-DD hh:mm)", $mystart, "format is <em>YYYY</em> year, <em>MM</em> month, <em>DD</em> day, <em>hh</em> hour and <em>mm</em> minute"],
+        '$enddate' => ["enddate", "End of the Blackout<br />(YYYY-MM-DD hh:mm)", $myend, ""],
 
     ));
     $date1 = DateTime::createFromFormat('Y-m-d G:i', $mystart);
@@ -110,7 +113,7 @@ function blackout_plugin_admin(&$a, &$o) {
         $o = '<p>Please double check that the current settings for the blackout. Begin will be <strong>'.$mystart.'</strong> and it will end <strong>'.$myend.'</strong>.</p>' . $o;
     }
 }
-function blackout_plugin_admin_post (&$a) {
+function blackout_addon_admin_post (&$a) {
     $begindate = trim($_POST['startdate']);
     $enddate = trim($_POST['enddate']);
     $url = trim($_POST['rurl']);
index b9b5ec308fd0187a46f3b691260c2a22bf479487..1b0c6f628611374a5ab516410a085c0617d75ea2 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-06-22 13:18+0200\n"
-"PO-Revision-Date: 2014-09-10 10:22+0000\n"
+"PO-Revision-Date: 2018-03-19 19:50+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index 223a1990c336d17a20635017e16d6d222695fad8..6f2b6d89e0929840e1785fe53c0fa276671faf1f 100644 (file)
@@ -1,41 +1,39 @@
 <?php
-
-
 /**
  * Name: blockem
- * Description: block people
+ * Description: Allows users to hide content by collapsing posts and replies.
  * Version: 1.0
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
  * 
  */
-
-function blockem_install() {
-       register_hook('prepare_body', 'addon/blockem/blockem.php', 'blockem_prepare_body');
-       register_hook('display_item', 'addon/blockem/blockem.php', 'blockem_display_item');
-       register_hook('plugin_settings', 'addon/blockem/blockem.php', 'blockem_addon_settings');
-       register_hook('plugin_settings_post', 'addon/blockem/blockem.php', 'blockem_addon_settings_post');
-       register_hook('conversation_start', 'addon/blockem/blockem.php', 'blockem_conversation_start');
-       register_hook('item_photo_menu', 'addon/blockem/blockem.php', 'blockem_item_photo_menu');
-       register_hook('enotify_store', 'addon/blockem/blockem.php', 'blockem_enotify_store' );
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+
+function blockem_install()
+{
+       Addon::registerHook('prepare_body', 'addon/blockem/blockem.php', 'blockem_prepare_body');
+       Addon::registerHook('display_item', 'addon/blockem/blockem.php', 'blockem_display_item');
+       Addon::registerHook('addon_settings', 'addon/blockem/blockem.php', 'blockem_addon_settings');
+       Addon::registerHook('addon_settings_post', 'addon/blockem/blockem.php', 'blockem_addon_settings_post');
+       Addon::registerHook('conversation_start', 'addon/blockem/blockem.php', 'blockem_conversation_start');
+       Addon::registerHook('item_photo_menu', 'addon/blockem/blockem.php', 'blockem_item_photo_menu');
+       Addon::registerHook('enotify_store', 'addon/blockem/blockem.php', 'blockem_enotify_store');
 }
 
-
-function blockem_uninstall() {
-       unregister_hook('prepare_body', 'addon/blockem/blockem.php', 'blockem_prepare_body');
-       unregister_hook('display_item', 'addon/blockem/blockem.php', 'blockem_display_item');
-       unregister_hook('plugin_settings', 'addon/blockem/blockem.php', 'blockem_addon_settings');
-       unregister_hook('plugin_settings_post', 'addon/blockem/blockem.php', 'blockem_addon_settings_post');
-       unregister_hook('conversation_start', 'addon/blockem/blockem.php', 'blockem_conversation_start');
-       unregister_hook('item_photo_menu', 'addon/blockem/blockem.php', 'blockem_item_photo_menu');
-       unregister_hook('enotify_store', 'addon/blockem/blockem.php', 'blockem_enotify_store' );
-
+function blockem_uninstall()
+{
+       Addon::unregisterHook('prepare_body', 'addon/blockem/blockem.php', 'blockem_prepare_body');
+       Addon::unregisterHook('display_item', 'addon/blockem/blockem.php', 'blockem_display_item');
+       Addon::unregisterHook('addon_settings', 'addon/blockem/blockem.php', 'blockem_addon_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/blockem/blockem.php', 'blockem_addon_settings_post');
+       Addon::unregisterHook('conversation_start', 'addon/blockem/blockem.php', 'blockem_conversation_start');
+       Addon::unregisterHook('item_photo_menu', 'addon/blockem/blockem.php', 'blockem_item_photo_menu');
+       Addon::unregisterHook('enotify_store', 'addon/blockem/blockem.php', 'blockem_enotify_store');
 }
 
-
-
-
-
-function blockem_addon_settings(&$a,&$s) {
+function blockem_addon_settings(&$a, &$s)
+{
 
        if(! local_user())
                return;
@@ -45,24 +43,25 @@ function blockem_addon_settings(&$a,&$s) {
     $a->page['htmlhead'] .= '<link rel="stylesheet"  type="text/css" href="' . $a->get_baseurl() . '/addon/blockem/blockem.css' . '" media="all" />' . "\r\n";
 
 
-       $words = get_pconfig(local_user(),'blockem','words');
+       $words = PConfig::get(local_user(), 'blockem', 'words');
        if(! $words)
                $words = '';
 
     $s .= '<span id="settings_blockem_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_blockem_expanded\'); openClose(\'settings_blockem_inflated\');">';
-    $s .= '<h3>' . t('"Blockem"') . '</h3>';
+    $s .= '<h3>' . L10n::t('"Blockem"') . '</h3>';
     $s .= '</span>';
     $s .= '<div id="settings_blockem_expanded" class="settings-block" style="display: none;">';
     $s .= '<span class="fakelink" onclick="openClose(\'settings_blockem_expanded\'); openClose(\'settings_blockem_inflated\');">';
-    $s .= '<h3>' . t('"Blockem"') . '</h3>';
+    $s .= '<h3>' . L10n::t('"Blockem"') . '</h3>';
     $s .= '</span>';
 
     $s .= '<div id="blockem-wrapper">';
-    $s .= '<label id="blockem-label" for="blockem-words">' . t('Comma separated profile URLS to block') . ' </label>';
+    $s .= '<div id="blockem-desc">'. L10n::t("Hides user's content by collapsing posts. Also replaces their avatar with generic image.") . ' </div>';
+    $s .= '<label id="blockem-label" for="blockem-words">' . L10n::t('Comma separated profile URLS:') . ' </label>';
     $s .= '<textarea id="blockem-words" type="text" name="blockem-words" >' . htmlspecialchars($words) . '</textarea>';
     $s .= '</div><div class="clear"></div>';
 
-    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="blockem-submit" name="blockem-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="blockem-submit" name="blockem-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
        return;
 
@@ -74,12 +73,11 @@ function blockem_addon_settings_post(&$a,&$b) {
                return;
 
        if($_POST['blockem-submit']) {
-               set_pconfig(local_user(),'blockem','words',trim($_POST['blockem-words']));
-               info( t('BLOCKEM Settings saved.') . EOL);
+               PConfig::set(local_user(),'blockem','words',trim($_POST['blockem-words']));
+               info(L10n::t('BLOCKEM Settings saved.') . EOL);
        }
 }
 
-
 function blockem_enotify_store(&$a,&$b) {
 
        $words = get_pconfig($b['uid'],'blockem','words');
@@ -139,17 +137,15 @@ function blockem_prepare_body(&$a,&$b) {
        }
        if($found) {
                $rnd = random_string(8);
-               $b['html'] = '<div id="blockem-wrap-' . $rnd . '" class="fakelink" onclick=openClose(\'blockem-' . $rnd . '\'); >' . sprintf( t('Blocked %s - Click to open/close'),$word ) . '</div><div id="blockem-' . $rnd . '" style="display: none; " >' . $b['html'] . '</div>';  
+               $b['html'] = '<div id="blockem-wrap-' . $rnd . '" class="fakelink" onclick=openClose(\'blockem-' . $rnd . '\'); >' . L10n::t('Hidden content by %s - Click to open/close', $word) . '</div><div id="blockem-' . $rnd . '" style="display: none; " >' . $b['html'] . '</div>';
        }
 }
 
-
 function blockem_display_item(&$a,&$b) {
        if(strstr($b['output']['body'],'id="blockem-wrap-'))
                $b['output']['thumb'] = $a->get_baseurl() . "/images/person-80.jpg";
 }
 
-
 function blockem_conversation_start(&$a,&$b) {
 
        if(! local_user())
@@ -194,9 +190,9 @@ function blockem_item_photo_menu(&$a,&$b) {
                }
        }
        if($blocked)
-               $b['menu'][ t('Unblock Author')] = 'javascript:blockemUnblock(\'' . $author . '\');';
+               $b['menu'][L10n::t('Unblock Author')] = 'javascript:blockemUnblock(\'' . $author . '\');';
        else
-               $b['menu'][ t('Block Author')] = 'javascript:blockemBlock(\'' . $author . '\');';
+               $b['menu'][L10n::t('Block Author')] = 'javascript:blockemBlock(\'' . $author . '\');';
 }
 
 function blockem_module() {}
@@ -227,7 +223,7 @@ function blockem_init(&$a) {
                $words = implode(',',$newarr);
        }
 
-       set_pconfig(local_user(),'blockem','words',$words);
-       info( t('blockem settings updated') . EOL );
+       PConfig::set(local_user(),'blockem','words',$words);
+       info(L10n::t('blockem settings updated') . EOL );
        killme();
 }
index 39c4f231dd0c545a53e57d92bfb4aa28b82a6261..ad7ea9c2565a331b26733393c84301b6257bcfbf 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-22 13:18+0200\n"
+"POT-Creation-Date: 2018-02-09 13:00+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,35 +17,41 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: blockem.php:53 blockem.php:57
+#: blockem.php:51 blockem.php:55
 msgid "\"Blockem\""
 msgstr ""
 
-#: blockem.php:61
-msgid "Comma separated profile URLS to block"
+#: blockem.php:59
+msgid ""
+"Hides user's content by collapsing posts. Also replaces their avatar with "
+"generic image."
+msgstr ""
+
+#: blockem.php:60
+msgid "Comma separated profile URLS:"
 msgstr ""
 
-#: blockem.php:65
+#: blockem.php:64
 msgid "Save Settings"
 msgstr ""
 
-#: blockem.php:78
+#: blockem.php:77
 msgid "BLOCKEM Settings saved."
 msgstr ""
 
-#: blockem.php:142
+#: blockem.php:140
 #, php-format
-msgid "Blocked %s - Click to open/close"
+msgid "Hidden content by %s - Click to open/close"
 msgstr ""
 
-#: blockem.php:197
+#: blockem.php:193
 msgid "Unblock Author"
 msgstr ""
 
-#: blockem.php:199
+#: blockem.php:195
 msgid "Block Author"
 msgstr ""
 
-#: blockem.php:231
+#: blockem.php:227
 msgid "blockem settings updated"
 msgstr ""
index c2384d616ee84c33d63992a1b7024212d7e2a612..14665878f7ac89c75821f5dd4bc78293eff151e5 100644 (file)
@@ -4,50 +4,57 @@
 # 
 # 
 # Translators:
-# bavatar <tobias.diekershoff@gmx.net>, 2014-2015
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2014
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-07-27 05:29+0000\n"
-"Last-Translator: bavatar <tobias.diekershoff@gmx.net>\n"
-"Language-Team: German (http://www.transifex.com/projects/p/friendica/language/de/)\n"
+"POT-Creation-Date: 2018-02-09 13:00+0100\n"
+"PO-Revision-Date: 2018-02-10 17:32+0000\n"
+"Last-Translator: Tobias Diekershoff <tobias.diekershoff@gmx.net>\n"
+"Language-Team: German (http://www.transifex.com/Friendica/friendica/language/de/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: de\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: blockem.php:51
-msgid "\"Blockem\" Settings"
-msgstr "\"Blockem\"-Einstellungen"
+#: blockem.php:51 blockem.php:55
+msgid "\"Blockem\""
+msgstr "\"Blockem\""
 
-#: blockem.php:53
-msgid "Comma separated profile URLS to block"
-msgstr "Profil-URLs, die geblockt werden sollen (durch Kommas getrennt)"
+#: blockem.php:59
+msgid ""
+"Hides user's content by collapsing posts. Also replaces their avatar with "
+"generic image."
+msgstr "Verbirgt Inhalte von Kontakten durch kollabieren der Beiträge. Des weiteren wird das Profilbild durch einen generischen Avatar ersetzt."
+
+#: blockem.php:60
+msgid "Comma separated profile URLS:"
+msgstr "Komma separierte Liste von Profil URLs"
 
-#: blockem.php:57
-msgid "Submit"
-msgstr "Senden"
+#: blockem.php:64
+msgid "Save Settings"
+msgstr "Einstellungen speichern"
 
-#: blockem.php:70
+#: blockem.php:77
 msgid "BLOCKEM Settings saved."
 msgstr "BLOCKEM-Einstellungen gesichert."
 
-#: blockem.php:105
+#: blockem.php:140
 #, php-format
-msgid "Blocked %s - Click to open/close"
-msgstr "%s blockiert - Zum Öffnen/Schließen klicken"
+msgid "Hidden content by %s - Click to open/close"
+msgstr "Verborgene Inhalte von %s - Zum Öffnen/Schließen klicken"
 
-#: blockem.php:160
+#: blockem.php:193
 msgid "Unblock Author"
 msgstr "Autor freischalten"
 
-#: blockem.php:162
+#: blockem.php:195
 msgid "Block Author"
 msgstr "Autor blockieren"
 
-#: blockem.php:194
+#: blockem.php:227
 msgid "blockem settings updated"
 msgstr "blockem Einstellungen aktualisiert"
index d3089c4d73168793c2bd6bcd4faa4801cc6cb2ec..e9de08dc3ee351e83719df442288b7151f0362e5 100644 (file)
@@ -5,11 +5,12 @@ function string_plural_select_de($n){
        return ($n != 1);;
 }}
 ;
-$a->strings["\"Blockem\" Settings"] = "\"Blockem\"-Einstellungen";
-$a->strings["Comma separated profile URLS to block"] = "Profil-URLs, die geblockt werden sollen (durch Kommas getrennt)";
-$a->strings["Submit"] = "Senden";
+$a->strings["\"Blockem\""] = "\"Blockem\"";
+$a->strings["Hides user's content by collapsing posts. Also replaces their avatar with generic image."] = "Verbirgt Inhalte von Kontakten durch kollabieren der Beiträge. Des weiteren wird das Profilbild durch einen generischen Avatar ersetzt.";
+$a->strings["Comma separated profile URLS:"] = "Komma separierte Liste von Profil URLs";
+$a->strings["Save Settings"] = "Einstellungen speichern";
 $a->strings["BLOCKEM Settings saved."] = "BLOCKEM-Einstellungen gesichert.";
-$a->strings["Blocked %s - Click to open/close"] = "%s blockiert - Zum Öffnen/Schließen klicken";
+$a->strings["Hidden content by %s - Click to open/close"] = "Verborgene Inhalte von %s - Zum Öffnen/Schließen klicken";
 $a->strings["Unblock Author"] = "Autor freischalten";
 $a->strings["Block Author"] = "Autor blockieren";
 $a->strings["blockem settings updated"] = "blockem Einstellungen aktualisiert";
diff --git a/blockem/lang/en-gb/messages.po b/blockem/lang/en-gb/messages.po
new file mode 100644 (file)
index 0000000..6bcc7b9
--- /dev/null
@@ -0,0 +1,59 @@
+# ADDON blockem
+# Copyright (C)
+# This file is distributed under the same license as the Friendica blockem addon package.
+# 
+# 
+# Translators:
+# Andy H3 <andy@hubup.pro>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-02-09 13:00+0100\n"
+"PO-Revision-Date: 2018-03-15 14:10+0000\n"
+"Last-Translator: Andy H3 <andy@hubup.pro>\n"
+"Language-Team: English (United Kingdom) (http://www.transifex.com/Friendica/friendica/language/en_GB/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_GB\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: blockem.php:51 blockem.php:55
+msgid "\"Blockem\""
+msgstr "\"Blockem\""
+
+#: blockem.php:59
+msgid ""
+"Hides user's content by collapsing posts. Also replaces their avatar with "
+"generic image."
+msgstr "Hides user's content by collapsing posts. Also replaces their avatar with generic image."
+
+#: blockem.php:60
+msgid "Comma separated profile URLS:"
+msgstr "Comma separated profile URLs:"
+
+#: blockem.php:64
+msgid "Save Settings"
+msgstr "Save settings"
+
+#: blockem.php:77
+msgid "BLOCKEM Settings saved."
+msgstr "Blockem settings saved."
+
+#: blockem.php:140
+#, php-format
+msgid "Hidden content by %s - Click to open/close"
+msgstr "Hidden content by %s - Reveal/hide"
+
+#: blockem.php:193
+msgid "Unblock Author"
+msgstr "Unblock author"
+
+#: blockem.php:195
+msgid "Block Author"
+msgstr "Block author"
+
+#: blockem.php:227
+msgid "blockem settings updated"
+msgstr "Blockem settings updated"
diff --git a/blockem/lang/en-gb/strings.php b/blockem/lang/en-gb/strings.php
new file mode 100644 (file)
index 0000000..d31cebe
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+if(! function_exists("string_plural_select_en_gb")) {
+function string_plural_select_en_gb($n){
+       return ($n != 1);;
+}}
+;
+$a->strings["\"Blockem\""] = "\"Blockem\"";
+$a->strings["Hides user's content by collapsing posts. Also replaces their avatar with generic image."] = "Hides user's content by collapsing posts. Also replaces their avatar with generic image.";
+$a->strings["Comma separated profile URLS:"] = "Comma separated profile URLs:";
+$a->strings["Save Settings"] = "Save settings";
+$a->strings["BLOCKEM Settings saved."] = "Blockem settings saved.";
+$a->strings["Hidden content by %s - Click to open/close"] = "Hidden content by %s - Reveal/hide";
+$a->strings["Unblock Author"] = "Unblock author";
+$a->strings["Block Author"] = "Block author";
+$a->strings["blockem settings updated"] = "Blockem settings updated";
diff --git a/blockem/lang/en-us/messages.po b/blockem/lang/en-us/messages.po
new file mode 100644 (file)
index 0000000..362c489
--- /dev/null
@@ -0,0 +1,59 @@
+# ADDON blockem
+# Copyright (C)
+# This file is distributed under the same license as the Friendica blockem addon package.
+# 
+# 
+# Translators:
+# Andy H3 <andy@hubup.pro>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-02-09 13:00+0100\n"
+"PO-Revision-Date: 2018-03-15 14:14+0000\n"
+"Last-Translator: Andy H3 <andy@hubup.pro>\n"
+"Language-Team: English (United States) (http://www.transifex.com/Friendica/friendica/language/en_US/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_US\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: blockem.php:51 blockem.php:55
+msgid "\"Blockem\""
+msgstr "\"Blockem\""
+
+#: blockem.php:59
+msgid ""
+"Hides user's content by collapsing posts. Also replaces their avatar with "
+"generic image."
+msgstr "Hides user's content by collapsing posts. Also replaces their avatar with generic image."
+
+#: blockem.php:60
+msgid "Comma separated profile URLS:"
+msgstr "Comma separated profile URLs:"
+
+#: blockem.php:64
+msgid "Save Settings"
+msgstr "Save settings"
+
+#: blockem.php:77
+msgid "BLOCKEM Settings saved."
+msgstr "Blockem settings saved."
+
+#: blockem.php:140
+#, php-format
+msgid "Hidden content by %s - Click to open/close"
+msgstr "Hidden content by %s - Reveal/hide"
+
+#: blockem.php:193
+msgid "Unblock Author"
+msgstr "Unblock author"
+
+#: blockem.php:195
+msgid "Block Author"
+msgstr "Block author"
+
+#: blockem.php:227
+msgid "blockem settings updated"
+msgstr "Blockem settings updated"
diff --git a/blockem/lang/en-us/strings.php b/blockem/lang/en-us/strings.php
new file mode 100644 (file)
index 0000000..ad88b54
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+if(! function_exists("string_plural_select_en_us")) {
+function string_plural_select_en_us($n){
+       return ($n != 1);;
+}}
+;
+$a->strings["\"Blockem\""] = "\"Blockem\"";
+$a->strings["Hides user's content by collapsing posts. Also replaces their avatar with generic image."] = "Hides user's content by collapsing posts. Also replaces their avatar with generic image.";
+$a->strings["Comma separated profile URLS:"] = "Comma separated profile URLs:";
+$a->strings["Save Settings"] = "Save settings";
+$a->strings["BLOCKEM Settings saved."] = "Blockem settings saved.";
+$a->strings["Hidden content by %s - Click to open/close"] = "Hidden content by %s - Reveal/hide";
+$a->strings["Unblock Author"] = "Unblock author";
+$a->strings["Block Author"] = "Block author";
+$a->strings["blockem settings updated"] = "Blockem settings updated";
index 5e619da5b95cf485baca3460739d5af7654069d5..ea72109e5f8337a47fbc1b0c9835829b9dd67dde 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-22 13:18+0200\n"
-"PO-Revision-Date: 2014-09-10 10:23+0000\n"
+"POT-Creation-Date: 2018-02-09 13:00+0100\n"
+"PO-Revision-Date: 2018-03-19 13:14+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -19,35 +19,41 @@ msgstr ""
 "Language: it\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: blockem.php:53 blockem.php:57
+#: blockem.php:51 blockem.php:55
 msgid "\"Blockem\""
 msgstr "\"Blockem\""
 
-#: blockem.php:61
-msgid "Comma separated profile URLS to block"
-msgstr "Lista, separata da virgola, di indirizzi da bloccare"
+#: blockem.php:59
+msgid ""
+"Hides user's content by collapsing posts. Also replaces their avatar with "
+"generic image."
+msgstr "Nascondi il contenuto degli utenti collassando i messaggi. Sostituisce anche gli avatar con un'immagine generica."
+
+#: blockem.php:60
+msgid "Comma separated profile URLS:"
+msgstr "URL profili separati da virgola:"
 
-#: blockem.php:65
+#: blockem.php:64
 msgid "Save Settings"
 msgstr "Salva Impostazioni"
 
-#: blockem.php:78
+#: blockem.php:77
 msgid "BLOCKEM Settings saved."
 msgstr "Impostazioni BLOCKEM salvate."
 
-#: blockem.php:142
+#: blockem.php:140
 #, php-format
-msgid "Blocked %s - Click to open/close"
-msgstr "%s bloccato - Clicca per aprire/chiudere"
+msgid "Hidden content by %s - Click to open/close"
+msgstr "Contenuto di %s nascosto - Clicca per aprire/chiudere"
 
-#: blockem.php:197
+#: blockem.php:193
 msgid "Unblock Author"
 msgstr "Sblocca autore"
 
-#: blockem.php:199
+#: blockem.php:195
 msgid "Block Author"
 msgstr "Blocca autore"
 
-#: blockem.php:231
+#: blockem.php:227
 msgid "blockem settings updated"
 msgstr "Impostazioni 'blockem' aggiornate."
index 85f8a0ac54fb5680d138711bff7ab388b9b9f1a1..f3997eda8d04e786f43cbc6010262fb5bb694243 100644 (file)
@@ -6,10 +6,11 @@ function string_plural_select_it($n){
 }}
 ;
 $a->strings["\"Blockem\""] = "\"Blockem\"";
-$a->strings["Comma separated profile URLS to block"] = "Lista, separata da virgola, di indirizzi da bloccare";
+$a->strings["Hides user's content by collapsing posts. Also replaces their avatar with generic image."] = "Nascondi il contenuto degli utenti collassando i messaggi. Sostituisce anche gli avatar con un'immagine generica.";
+$a->strings["Comma separated profile URLS:"] = "URL profili separati da virgola:";
 $a->strings["Save Settings"] = "Salva Impostazioni";
 $a->strings["BLOCKEM Settings saved."] = "Impostazioni BLOCKEM salvate.";
-$a->strings["Blocked %s - Click to open/close"] = "%s bloccato - Clicca per aprire/chiudere";
+$a->strings["Hidden content by %s - Click to open/close"] = "Contenuto di %s nascosto - Clicca per aprire/chiudere";
 $a->strings["Unblock Author"] = "Sblocca autore";
 $a->strings["Block Author"] = "Blocca autore";
 $a->strings["blockem settings updated"] = "Impostazioni 'blockem' aggiornate.";
index 892e8a452e830587e2ca9be7e42da3697a66ae83..97d488bc2012acb88768c6a5cea5b84a12d762a0 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Name: Blogger Post Connector
  * Description: Post to Blogger (or anything else which uses blogger XMLRPC API)
@@ -7,47 +6,57 @@
  * 
  */
 
-function blogger_install() {
-    register_hook('post_local',           'addon/blogger/blogger.php', 'blogger_post_local');
-    register_hook('notifier_normal',      'addon/blogger/blogger.php', 'blogger_send');
-    register_hook('jot_networks',         'addon/blogger/blogger.php', 'blogger_jot_nets');
-    register_hook('connector_settings',      'addon/blogger/blogger.php', 'blogger_settings');
-    register_hook('connector_settings_post', 'addon/blogger/blogger.php', 'blogger_settings_post');
-
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\Network;
+
+function blogger_install()
+{
+       Addon::registerHook('post_local',           'addon/blogger/blogger.php', 'blogger_post_local');
+       Addon::registerHook('notifier_normal',      'addon/blogger/blogger.php', 'blogger_send');
+       Addon::registerHook('jot_networks',         'addon/blogger/blogger.php', 'blogger_jot_nets');
+       Addon::registerHook('connector_settings',      'addon/blogger/blogger.php', 'blogger_settings');
+       Addon::registerHook('connector_settings_post', 'addon/blogger/blogger.php', 'blogger_settings_post');
 }
-function blogger_uninstall() {
-    unregister_hook('post_local',       'addon/blogger/blogger.php', 'blogger_post_local');
-    unregister_hook('notifier_normal',  'addon/blogger/blogger.php', 'blogger_send');
-    unregister_hook('jot_networks',     'addon/blogger/blogger.php', 'blogger_jot_nets');
-    unregister_hook('connector_settings',      'addon/blogger/blogger.php', 'blogger_settings');
-    unregister_hook('connector_settings_post', 'addon/blogger/blogger.php', 'blogger_settings_post');
 
-       // obsolete - remove
-    unregister_hook('post_local_end',   'addon/blogger/blogger.php', 'blogger_send');
-    unregister_hook('plugin_settings',  'addon/blogger/blogger.php', 'blogger_settings');
-    unregister_hook('plugin_settings_post',  'addon/blogger/blogger.php', 'blogger_settings_post');
+function blogger_uninstall()
+{
+       Addon::unregisterHook('post_local',       'addon/blogger/blogger.php', 'blogger_post_local');
+       Addon::unregisterHook('notifier_normal',  'addon/blogger/blogger.php', 'blogger_send');
+       Addon::unregisterHook('jot_networks',     'addon/blogger/blogger.php', 'blogger_jot_nets');
+       Addon::unregisterHook('connector_settings',      'addon/blogger/blogger.php', 'blogger_settings');
+       Addon::unregisterHook('connector_settings_post', 'addon/blogger/blogger.php', 'blogger_settings_post');
 
+       // obsolete - remove
+       Addon::unregisterHook('post_local_end',   'addon/blogger/blogger.php', 'blogger_send');
+       Addon::unregisterHook('addon_settings',  'addon/blogger/blogger.php', 'blogger_settings');
+       Addon::unregisterHook('addon_settings_post',  'addon/blogger/blogger.php', 'blogger_settings_post');
 }
 
 
-function blogger_jot_nets(&$a,&$b) {
-    if(! local_user())
-        return;
+function blogger_jot_nets(&$a, &$b)
+{
+       if (!local_user()) {
+               return;
+       }
 
-    $bl_post = get_pconfig(local_user(),'blogger','post');
-    if(intval($bl_post) == 1) {
-        $bl_defpost = get_pconfig(local_user(),'blogger','post_by_default');
-        $selected = ((intval($bl_defpost) == 1) ? ' checked="checked" ' : '');
-        $b .= '<div class="profile-jot-net"><input type="checkbox" name="blogger_enable" ' . $selected . ' value="1" /> '
-            t('Post to blogger') . '</div>';
-    }
+       $bl_post = PConfig::get(local_user(), 'blogger', 'post');
+       if (intval($bl_post) == 1) {
+               $bl_defpost = PConfig::get(local_user(), 'blogger', 'post_by_default');
+               $selected = ((intval($bl_defpost) == 1) ? ' checked="checked" ' : '');
+               $b .= '<div class="profile-jot-net"><input type="checkbox" name="blogger_enable" ' . $selected . ' value="1" /> '
+               . L10n::t('Post to blogger') . '</div>';
+       }
 }
 
 
-function blogger_settings(&$a,&$s) {
-
-    if(! local_user())
-        return;
+function blogger_settings(&$a, &$s)
+{
+       if (! local_user()) {
+               return;
+       }
 
     /* Add our stylesheet to the page so we can make our settings look nice */
 
@@ -55,11 +64,11 @@ function blogger_settings(&$a,&$s) {
 
     /* Get the current state of our config variables */
 
-    $enabled = get_pconfig(local_user(),'blogger','post');
-    $checked = (($enabled) ? ' checked="checked" ' : '');
-    $css = (($enabled) ? '' : '-disabled');
+       $enabled = PConfig::get(local_user(), 'blogger', 'post');
+       $checked = (($enabled) ? ' checked="checked" ' : '');
+       $css = (($enabled) ? '' : '-disabled');
 
-    $def_enabled = get_pconfig(local_user(),'blogger','post_by_default');
+       $def_enabled = PConfig::get(local_user(), 'blogger', 'post_by_default');
 
     $def_checked = (($def_enabled) ? ' checked="checked" ' : '');
 
@@ -67,65 +76,59 @@ function blogger_settings(&$a,&$s) {
        $bl_password = get_pconfig(local_user(), 'blogger', 'bl_password');
        $bl_blog = get_pconfig(local_user(), 'blogger', 'bl_blog');
 
-
-    /* Add some HTML to the existing form */
-
-    $s .= '<span id="settings_blogger_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_blogger_expanded\'); openClose(\'settings_blogger_inflated\');">';
-    $s .= '<img class="connector'.$css.'" src="images/blogger.png" /><h3 class="connector">'. t('Blogger Export').'</h3>';
-    $s .= '</span>';
-    $s .= '<div id="settings_blogger_expanded" class="settings-block" style="display: none;">';
-    $s .= '<span class="fakelink" onclick="openClose(\'settings_blogger_expanded\'); openClose(\'settings_blogger_inflated\');">';
-    $s .= '<img class="connector'.$css.'" src="images/blogger.png" /><h3 class="connector">'. t('Blogger Export').'</h3>';
-    $s .= '</span>';
-
-    $s .= '<div id="blogger-enable-wrapper">';
-    $s .= '<label id="blogger-enable-label" for="blogger-checkbox">' . t('Enable Blogger Post Plugin') . '</label>';
-    $s .= '<input id="blogger-checkbox" type="checkbox" name="blogger" value="1" ' . $checked . '/>';
-    $s .= '</div><div class="clear"></div>';
-
-    $s .= '<div id="blogger-username-wrapper">';
-    $s .= '<label id="blogger-username-label" for="blogger-username">' . t('Blogger username') . '</label>';
-    $s .= '<input id="blogger-username" type="text" name="bl_username" value="' . $bl_username . '" />';
-    $s .= '</div><div class="clear"></div>';
-
-    $s .= '<div id="blogger-password-wrapper">';
-    $s .= '<label id="blogger-password-label" for="blogger-password">' . t('Blogger password') . '</label>';
-    $s .= '<input id="blogger-password" type="password" name="bl_password" value="' . $bl_password . '" />';
-    $s .= '</div><div class="clear"></div>';
-
-    $s .= '<div id="blogger-blog-wrapper">';
-    $s .= '<label id="blogger-blog-label" for="blogger-blog">' . t('Blogger API URL') . '</label>';
-    $s .= '<input id="blogger-blog" type="text" name="bl_blog" value="' . $bl_blog . '" />';
-    $s .= '</div><div class="clear"></div>';
-
-    $s .= '<div id="blogger-bydefault-wrapper">';
-    $s .= '<label id="blogger-bydefault-label" for="blogger-bydefault">' . t('Post to Blogger by default') . '</label>';
-    $s .= '<input id="blogger-bydefault" type="checkbox" name="bl_bydefault" value="1" ' . $def_checked . '/>';
-    $s .= '</div><div class="clear"></div>';
-
-    /* provide a submit button */
-
-    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="blogger-submit" name="blogger-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
-
+       /* Add some HTML to the existing form */
+       $s .= '<span id="settings_blogger_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_blogger_expanded\'); openClose(\'settings_blogger_inflated\');">';
+       $s .= '<img class="connector'.$css.'" src="images/blogger.png" /><h3 class="connector">'. L10n::t('Blogger Export').'</h3>';
+       $s .= '</span>';
+       $s .= '<div id="settings_blogger_expanded" class="settings-block" style="display: none;">';
+       $s .= '<span class="fakelink" onclick="openClose(\'settings_blogger_expanded\'); openClose(\'settings_blogger_inflated\');">';
+       $s .= '<img class="connector'.$css.'" src="images/blogger.png" /><h3 class="connector">'. L10n::t('Blogger Export').'</h3>';
+       $s .= '</span>';
+
+       $s .= '<div id="blogger-enable-wrapper">';
+       $s .= '<label id="blogger-enable-label" for="blogger-checkbox">' . L10n::t('Enable Blogger Post Addon') . '</label>';
+       $s .= '<input id="blogger-checkbox" type="checkbox" name="blogger" value="1" ' . $checked . '/>';
+       $s .= '</div><div class="clear"></div>';
+
+       $s .= '<div id="blogger-username-wrapper">';
+       $s .= '<label id="blogger-username-label" for="blogger-username">' . L10n::t('Blogger username') . '</label>';
+       $s .= '<input id="blogger-username" type="text" name="bl_username" value="' . $bl_username . '" />';
+       $s .= '</div><div class="clear"></div>';
+
+       $s .= '<div id="blogger-password-wrapper">';
+       $s .= '<label id="blogger-password-label" for="blogger-password">' . L10n::t('Blogger password') . '</label>';
+       $s .= '<input id="blogger-password" type="password" name="bl_password" value="' . $bl_password . '" />';
+       $s .= '</div><div class="clear"></div>';
+
+       $s .= '<div id="blogger-blog-wrapper">';
+       $s .= '<label id="blogger-blog-label" for="blogger-blog">' . L10n::t('Blogger API URL') . '</label>';
+       $s .= '<input id="blogger-blog" type="text" name="bl_blog" value="' . $bl_blog . '" />';
+       $s .= '</div><div class="clear"></div>';
+
+       $s .= '<div id="blogger-bydefault-wrapper">';
+       $s .= '<label id="blogger-bydefault-label" for="blogger-bydefault">' . L10n::t('Post to Blogger by default') . '</label>';
+       $s .= '<input id="blogger-bydefault" type="checkbox" name="bl_bydefault" value="1" ' . $def_checked . '/>';
+       $s .= '</div><div class="clear"></div>';
+
+       /* provide a submit button */
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="blogger-submit" name="blogger-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 }
 
 
-function blogger_settings_post(&$a,&$b) {
-
-       if(x($_POST,'blogger-submit')) {
-
-               set_pconfig(local_user(),'blogger','post',intval($_POST['blogger']));
-               set_pconfig(local_user(),'blogger','post_by_default',intval($_POST['bl_bydefault']));
-               set_pconfig(local_user(),'blogger','bl_username',trim($_POST['bl_username']));
-               set_pconfig(local_user(),'blogger','bl_password',trim($_POST['bl_password']));
-               set_pconfig(local_user(),'blogger','bl_blog',trim($_POST['bl_blog']));
-
+function blogger_settings_post(&$a, &$b)
+{
+       if (x($_POST, 'blogger-submit')) {
+               PConfig::set(local_user(), 'blogger', 'post', intval($_POST['blogger']));
+               PConfig::set(local_user(), 'blogger', 'post_by_default', intval($_POST['bl_bydefault']));
+               PConfig::set(local_user(), 'blogger', 'bl_username', trim($_POST['bl_username']));
+               PConfig::set(local_user(), 'blogger', 'bl_password', trim($_POST['bl_password']));
+               PConfig::set(local_user(), 'blogger', 'bl_blog', trim($_POST['bl_blog']));
        }
 
 }
 
-function blogger_post_local(&$a,&$b) {
-
+function blogger_post_local(&$a, &$b)
+{
        // This can probably be changed to allow editing by pointing to a different API endpoint
 
        if($b['edit'])
@@ -137,11 +140,11 @@ function blogger_post_local(&$a,&$b) {
        if($b['private'] || $b['parent'])
                return;
 
-    $bl_post   = intval(get_pconfig(local_user(),'blogger','post'));
+       $bl_post   = intval(PConfig::get(local_user(), 'blogger', 'post'));
 
-       $bl_enable = (($bl_post && x($_REQUEST,'blogger_enable')) ? intval($_REQUEST['blogger_enable']) : 0);
+       $bl_enable = (($bl_post && x($_REQUEST, 'blogger_enable')) ? intval($_REQUEST['blogger_enable']) : 0);
 
-       if($b['api_source'] && intval(get_pconfig(local_user(),'blogger','post_by_default')))
+       if ($b['api_source'] && intval(PConfig::get(local_user(), 'blogger', 'post_by_default'))) {
                $bl_enable = 1;
 
     if(! $bl_enable)
@@ -155,28 +158,24 @@ function blogger_post_local(&$a,&$b) {
 
 
 
-function blogger_send(&$a,&$b) {
-
-    if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited']))
-        return;
-
-    if(! strstr($b['postopts'],'blogger'))
-        return;
-
-    if($b['parent'] != $b['id'])
-        return;
-
+function blogger_send(&$a, &$b)
+{
+       if ($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited'])) {
+               return;
+       }
 
-       $bl_username = xmlify(get_pconfig($b['uid'],'blogger','bl_username'));
-       $bl_password = xmlify(get_pconfig($b['uid'],'blogger','bl_password'));
-       $bl_blog = get_pconfig($b['uid'],'blogger','bl_blog');
+       if (! strstr($b['postopts'], 'blogger')) {
+               return;
+       }
 
-       if($bl_username && $bl_password && $bl_blog) {
 
-               require_once('include/bbcode.php');
+       $bl_username = xmlify(PConfig::get($b['uid'], 'blogger', 'bl_username'));
+       $bl_password = xmlify(PConfig::get($b['uid'], 'blogger', 'bl_password'));
+       $bl_blog = PConfig::get($b['uid'], 'blogger', 'bl_blog');
 
-               $title = '<title>' . (($b['title']) ? $b['title'] : t('Post from Friendica')) . '</title>';
-               $post = $title . bbcode($b['body']);
+       if ($bl_username && $bl_password && $bl_blog) {
+               $title = '<title>' . (($b['title']) ? $b['title'] : L10n::t('Post from Friendica')) . '</title>';
+               $post = $title . BBCode::convert($b['body']);
                $post = xmlify($post);
 
                $xml = <<< EOT
@@ -197,10 +196,11 @@ EOT;
 
                logger('blogger: data: ' . $xml, LOGGER_DATA);
 
-               if($bl_blog !== 'test')
-                       $x = post_url($bl_blog,$xml);
+               if ($bl_blog !== 'test') {
+                       $x = Network::post($bl_blog, $xml);
+               }
+
                logger('posted to blogger: ' . (($x) ? $x : ''), LOGGER_DEBUG);
 
        }
 }
-
index 1f99bc6571b805c8add07f9a89f5817b3cbba24b..f04bbb39227ec47be226f06a95b58cad64c038ca 100644 (file)
@@ -26,7 +26,7 @@ msgid "Blogger Export"
 msgstr ""
 
 #: blogger.php:82
-msgid "Enable Blogger Post Plugin"
+msgid "Enable Blogger Post Addon"
 msgstr ""
 
 #: blogger.php:87
index 354d354aee5fc28c3de2a78abd67e9fe186e748e..572617cab355ad0ca03ed815f46d96790cf1b326 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to blogger"] = "Enviament a blogger";\r
 $a->strings["Blogger Post Settings"] = "Ajustos d'enviament a blogger";\r
-$a->strings["Enable Blogger Post Plugin"] = "Habilita el Plugin d'Enviaments a Blogger";\r
+$a->strings["Enable Blogger Post Addon"] = "Habilita el Addon d'Enviaments a Blogger";\r
 $a->strings["Blogger username"] = "Nom d'usuari a blogger";\r
 $a->strings["Blogger password"] = "Contrasenya a blogger";\r
 $a->strings["Blogger API URL"] = "Blogger API URL";\r
index 0d2a1227cf06bbc1a3ee039af75843552f237b7a..e2389585f900a4bfe876c3a21547b8496b470a37 100644 (file)
@@ -28,8 +28,8 @@ msgid "Blogger Export"
 msgstr "Blogger Export"
 
 #: blogger.php:82
-msgid "Enable Blogger Post Plugin"
-msgstr "Povolit Blogger Post Plugin"
+msgid "Enable Blogger Post Addon"
+msgstr "Povolit Blogger Post Addon"
 
 #: blogger.php:87
 msgid "Blogger username"
index 61cb7863ccea28b6b9eb8d3b1ea12e7616873991..0ecdfd790c734dab2d039e092c517655d370ceb1 100644 (file)
@@ -28,8 +28,8 @@ msgid "Blogger Export"
 msgstr "Blogger Export"
 
 #: blogger.php:82
-msgid "Enable Blogger Post Plugin"
-msgstr "Blogger-Post-Plugin aktivieren"
+msgid "Enable Blogger Post Addon"
+msgstr "Blogger-Post-Addon aktivieren"
 
 #: blogger.php:87
 msgid "Blogger username"
index 8e44b4c20e697e473835f2225e90c87d1331d96d..549b6a2baaf15c0c6b3992b8e288c69059353c52 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_de($n){
 ;
 $a->strings["Post to blogger"] = "Auf Blogger posten";
 $a->strings["Blogger Export"] = "Blogger Export";
-$a->strings["Enable Blogger Post Plugin"] = "Blogger-Post-Plugin aktivieren";
+$a->strings["Enable Blogger Post Addon"] = "Blogger-Post-Addon aktivieren";
 $a->strings["Blogger username"] = "Blogger-Benutzername";
 $a->strings["Blogger password"] = "Blogger-Passwort";
 $a->strings["Blogger API URL"] = "Blogger-API-URL";
index 5ab29790d1eeefa8c9b29588252316647880c3f4..a7783cd8fabcf5872be59651df3cfd196c98e9ed 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to blogger"] = "Afiŝi al blogger";\r
 $a->strings["Blogger Post Settings"] = "Agordo pri Blogger Afiŝoj";\r
-$a->strings["Enable Blogger Post Plugin"] = "Ŝalti la Blogger afiŝo kromprogramon";\r
+$a->strings["Enable Blogger Post Addon"] = "Ŝalti la Blogger afiŝo kromprogramon";\r
 $a->strings["Blogger username"] = "Blogger uzantonomo";\r
 $a->strings["Blogger password"] = "Blogger pasvorto";\r
 $a->strings["Blogger API URL"] = "Blogger API URL";\r
index 86b1dcb7a64053b28e8926f7891a0ab676a025ad..66b6804fe4955db70b446c6c3d5f7e377a1b56dd 100644 (file)
@@ -27,8 +27,8 @@ msgid "Blogger Export"
 msgstr "Esportar Blogger"
 
 #: blogger.php:82
-msgid "Enable Blogger Post Plugin"
-msgstr "Activar plugin de entrada de Blogger"
+msgid "Enable Blogger Post Addon"
+msgstr "Activar addon de entrada de Blogger"
 
 #: blogger.php:87
 msgid "Blogger username"
index 01441ae5af62bda6b076380df03138d11e72dcc6..47e44a4990c69377de02bdd2d21fb6633c9873b7 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_es($n){
 ;
 $a->strings["Post to blogger"] = "Entrada para blogger";
 $a->strings["Blogger Export"] = "Esportar Blogger";
-$a->strings["Enable Blogger Post Plugin"] = "Activar plugin de entrada de Blogger";
+$a->strings["Enable Blogger Post Addon"] = "Activar addon de entrada de Blogger";
 $a->strings["Blogger username"] = "Nombre de usuario de Blogger";
 $a->strings["Blogger password"] = "Contraseña de Blogger";
 $a->strings["Blogger API URL"] = "URL API de Blogger";
index 0438f3d801c4fd1b0d54d92ebc98421c9d140ed8..497bf0bed3a7868858dadca84d17224b2f690d93 100644 (file)
@@ -28,7 +28,7 @@ msgid "Blogger Export"
 msgstr ""
 
 #: blogger.php:82
-msgid "Enable Blogger Post Plugin"
+msgid "Enable Blogger Post Addon"
 msgstr "Activer le connecteur Blogger"
 
 #: blogger.php:87
index 2265182a4650df3ff73b1ce732616b19ea65d707..89a429aef7defaac55d639dce33c30ade3e220a9 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_fr($n){
 ;
 $a->strings["Post to blogger"] = "Poster sur Blogger";
 $a->strings["Blogger Export"] = "";
-$a->strings["Enable Blogger Post Plugin"] = "Activer le connecteur Blogger";
+$a->strings["Enable Blogger Post Addon"] = "Activer le connecteur Blogger";
 $a->strings["Blogger username"] = "Nom d'utilisateur Blogger";
 $a->strings["Blogger password"] = "Mot de passe Blogger";
 $a->strings["Blogger API URL"] = "URL de l'API de Blogger";
index 1c76cf7412937fc1e92d20342e739a93b0d3e26c..e29ce4968ba06d1d26d7ceb447da67c969219839 100644 (file)
@@ -28,7 +28,7 @@ msgid "Blogger Export"
 msgstr "Flytja út blogg"
 
 #: blogger.php:82
-msgid "Enable Blogger Post Plugin"
+msgid "Enable Blogger Post Addon"
 msgstr "Virkja sendiviðbót fyrir blogg"
 
 #: blogger.php:87
index 01f532f61972b97691af59246b2cc37bd601f5bc..deab7af80fb6ade3cafc4ae447c9c5d93d2b8385 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_is($n){
 ;
 $a->strings["Post to blogger"] = "Senda færslu á bloggara";
 $a->strings["Blogger Export"] = "Flytja út blogg";
-$a->strings["Enable Blogger Post Plugin"] = "Virkja sendiviðbót fyrir blogg";
+$a->strings["Enable Blogger Post Addon"] = "Virkja sendiviðbót fyrir blogg";
 $a->strings["Blogger username"] = "Notandanafn bloggara";
 $a->strings["Blogger password"] = "Aðgangsorð bloggara";
 $a->strings["Blogger API URL"] = "API slóð bloggs";
index 6babcabf4c97a693ddff67cad5be371df5a235da..9ee69d62da265e33e4a1c9f3e0785affaebc74a3 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-06-22 13:18+0200\n"
-"PO-Revision-Date: 2014-09-10 10:24+0000\n"
+"PO-Revision-Date: 2018-03-19 13:21+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -28,8 +28,8 @@ msgid "Blogger Export"
 msgstr "Esporta Blogger"
 
 #: blogger.php:82
-msgid "Enable Blogger Post Plugin"
-msgstr "Abilita il plugin di invio a Blogger"
+msgid "Enable Blogger Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio a Blogger"
 
 #: blogger.php:87
 msgid "Blogger username"
index deea28a52b49b37c24d342254fc7c84eed80b62f..80b7b5fae8ca597b6920e4f1c3e3099670d8108c 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_it($n){
 ;
 $a->strings["Post to blogger"] = "Invia a Blogger";
 $a->strings["Blogger Export"] = "Esporta Blogger";
-$a->strings["Enable Blogger Post Plugin"] = "Abilita il plugin di invio a Blogger";
+$a->strings["Enable Blogger Post Addon"] = "Abilita il componente aggiuntivo di invio a Blogger";
 $a->strings["Blogger username"] = "Nome utente Blogger";
 $a->strings["Blogger password"] = "Password Blogger";
 $a->strings["Blogger API URL"] = "Indirizzo API Blogger";
index de7246bc7dd840952f972f4c20e35f9c488eb1bf..3c5a03dffe66f0fc9a781d6acbe82a1aac79a02f 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to blogger"] = "";\r
 $a->strings["Blogger Post Settings"] = "";\r
-$a->strings["Enable Blogger Post Plugin"] = "";\r
+$a->strings["Enable Blogger Post Addon"] = "";\r
 $a->strings["Blogger username"] = "";\r
 $a->strings["Blogger password"] = "";\r
 $a->strings["Blogger API URL"] = "";\r
index a08b447b54489db3ba728b058c42b48d073e2c33..c2e7e2d62bd2cfa521fd28b61c2edf890319a649 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to blogger"] = "Post na blogger";\r
 $a->strings["Blogger Post Settings"] = "Ustawienia postów na Blogger";\r
-$a->strings["Enable Blogger Post Plugin"] = "";\r
+$a->strings["Enable Blogger Post Addon"] = "";\r
 $a->strings["Blogger username"] = "Nazwa użytkownika na Blogger";\r
 $a->strings["Blogger password"] = "Hasło do Blogger";\r
 $a->strings["Blogger API URL"] = "";\r
index af8a5ba0529b97eaa8f4c374ea438f44633f6feb..6b22fc20480c8c1b809b6e059bd31629f3eaf363 100644 (file)
@@ -29,7 +29,7 @@ msgid "Blogger Export"
 msgstr "Exportador Blogger"
 
 #: blogger.php:82
-msgid "Enable Blogger Post Plugin"
+msgid "Enable Blogger Post Addon"
 msgstr "Habilitar plug-in para publicar no Blogger"
 
 #: blogger.php:87
index dcd10fabbdbdd5a6f66c6903bccaa42288cb8fe4..74a79acade6de8e20db64eeed69cfc0d9633a884 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_pt_br($n){
 ;
 $a->strings["Post to blogger"] = "Publicar no Blogger";
 $a->strings["Blogger Export"] = "Exportador Blogger";
-$a->strings["Enable Blogger Post Plugin"] = "Habilitar plug-in para publicar no Blogger";
+$a->strings["Enable Blogger Post Addon"] = "Habilitar plug-in para publicar no Blogger";
 $a->strings["Blogger username"] = "Nome de usuário no Blogger";
 $a->strings["Blogger password"] = "Senha do Blogger";
 $a->strings["Blogger API URL"] = "URL da API do Blogger";
index 8ba21d2f7d3a7c544c7dd741b3ede759043594ea..de35da2b8e50d62e51a295bf93d9b22382da105f 100644 (file)
@@ -27,7 +27,7 @@ msgid "Blogger Export"
 msgstr "Export pe Blogger "
 
 #: blogger.php:82
-msgid "Enable Blogger Post Plugin"
+msgid "Enable Blogger Post Addon"
 msgstr "Activare Modul Postare pe Blogger "
 
 #: blogger.php:87
index f89fd4b9882542d934a0c58e36cc10a2c898f9b5..f6aac95deeb2fe7c16cd1354fab8ff8eeb774e38 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_ro($n){
 ;
 $a->strings["Post to blogger"] = "Postați pe Blogger";
 $a->strings["Blogger Export"] = "Export pe Blogger ";
-$a->strings["Enable Blogger Post Plugin"] = "Activare Modul Postare pe Blogger ";
+$a->strings["Enable Blogger Post Addon"] = "Activare Modul Postare pe Blogger ";
 $a->strings["Blogger username"] = "Utilizator Blogger";
 $a->strings["Blogger password"] = "Parolă Blogger ";
 $a->strings["Blogger API URL"] = "URL Cheie API Blogger ";
index 38942ed6d7b6782a59bc9e9d1f8ed664985263df..93d8ce3f7c50b4bd19752528207c3c8ed4ec7b4b 100644 (file)
@@ -28,7 +28,7 @@ msgid "Blogger Export"
 msgstr "Экспорт в Blogger"
 
 #: blogger.php:82
-msgid "Enable Blogger Post Plugin"
+msgid "Enable Blogger Post Addon"
 msgstr "Включить плагин Blogger"
 
 #: blogger.php:87
index a718ce74b6c18b5bc266898636cfdb60d9b5f3e9..3c2e1a2993c19f7f024e568fe62db1386ad6a970 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_ru($n){
 ;
 $a->strings["Post to blogger"] = "Написать в Blogger";
 $a->strings["Blogger Export"] = "Экспорт в Blogger";
-$a->strings["Enable Blogger Post Plugin"] = "Включить плагин Blogger";
+$a->strings["Enable Blogger Post Addon"] = "Включить плагин Blogger";
 $a->strings["Blogger username"] = "Имя пользователя Blogger";
 $a->strings["Blogger password"] = "Пароль Blogger";
 $a->strings["Blogger API URL"] = "Blogger API URL";
index 6134a7d1ccf59f129ae13484e8669394e3e109fc..d9b717312ea85989944c93fdfec7bef87f537639 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to blogger"] = "转播到blogger";\r
 $a->strings["Blogger Post Settings"] = "Blogger转播设置";\r
-$a->strings["Enable Blogger Post Plugin"] = "使Blogger转播插件可用";\r
+$a->strings["Enable Blogger Post Addon"] = "使Blogger转播插件可用";\r
 $a->strings["Blogger username"] = "Blogger用户名";\r
 $a->strings["Blogger password"] = "Blogger密码";\r
 $a->strings["Blogger API URL"] = "Blogger API URL";\r
index 2ba2b01e6eab6a45feaef2d9cbd6cc8113e8f8a0..f97cf07b7b690923928382763f5e06c9cb175fbe 100644 (file)
@@ -5,4 +5,4 @@ Please register an app at [http://bufferapp.com/developers/api](http://bufferapp
 Please use (your server address)/buffer/connect as Callback URL.
 
 After the registration please enter the values for "Client ID" and "Client Secret" in the 
-[administration](admin/plugins/buffer).
+[administration](admin/addons/buffer).
index ca33708c831e191228d43c2964de67aad8a84226..9b0979ee7b4e5bd0effe15f32c42c795271c7e4a 100644 (file)
@@ -5,22 +5,30 @@
  * Version: 0.2
  * Author: Michael Vogel <http://pirati.ca/profile/heluecht>
  */
-require('addon/buffer/bufferapp.php');
+require 'addon/buffer/bufferapp.php';
+
+use Friendica\App;
+use Friendica\Content\Text\BBCode;
+use Friendica\Content\Text\Plaintext;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 function buffer_install() {
-       register_hook('post_local',           'addon/buffer/buffer.php', 'buffer_post_local');
-       register_hook('notifier_normal',      'addon/buffer/buffer.php', 'buffer_send');
-       register_hook('jot_networks',         'addon/buffer/buffer.php', 'buffer_jot_nets');
-       register_hook('connector_settings',      'addon/buffer/buffer.php', 'buffer_settings');
-       register_hook('connector_settings_post', 'addon/buffer/buffer.php', 'buffer_settings_post');
+       Addon::registerHook('post_local',           'addon/buffer/buffer.php', 'buffer_post_local');
+       Addon::registerHook('notifier_normal',      'addon/buffer/buffer.php', 'buffer_send');
+       Addon::registerHook('jot_networks',         'addon/buffer/buffer.php', 'buffer_jot_nets');
+       Addon::registerHook('connector_settings',      'addon/buffer/buffer.php', 'buffer_settings');
+       Addon::registerHook('connector_settings_post', 'addon/buffer/buffer.php', 'buffer_settings_post');
 }
 
 function buffer_uninstall() {
-       unregister_hook('post_local',       'addon/buffer/buffer.php', 'buffer_post_local');
-       unregister_hook('notifier_normal',  'addon/buffer/buffer.php', 'buffer_send');
-       unregister_hook('jot_networks',     'addon/buffer/buffer.php', 'buffer_jot_nets');
-       unregister_hook('connector_settings',      'addon/buffer/buffer.php', 'buffer_settings');
-       unregister_hook('connector_settings_post', 'addon/buffer/buffer.php', 'buffer_settings_post');
+       Addon::unregisterHook('post_local',       'addon/buffer/buffer.php', 'buffer_post_local');
+       Addon::unregisterHook('notifier_normal',  'addon/buffer/buffer.php', 'buffer_send');
+       Addon::unregisterHook('jot_networks',     'addon/buffer/buffer.php', 'buffer_jot_nets');
+       Addon::unregisterHook('connector_settings',      'addon/buffer/buffer.php', 'buffer_settings');
+       Addon::unregisterHook('connector_settings_post', 'addon/buffer/buffer.php', 'buffer_settings_post');
 }
 
 function buffer_module() {}
@@ -28,7 +36,7 @@ function buffer_module() {}
 function buffer_content(&$a) {
 
        if(! local_user()) {
-               notice( t('Permission denied.') . EOL);
+               notice(L10n::t('Permission denied.') . EOL);
                return '';
        }
 
@@ -50,28 +58,30 @@ function buffer_content(&$a) {
        return $o;
 }
 
-function buffer_plugin_admin(&$a, &$o){
-       $t = get_markup_template( "admin.tpl", "addon/buffer/" );
+function buffer_addon_admin(&$a, &$o)
+{
+       $t = get_markup_template("admin.tpl", "addon/buffer/");
 
-       $o = replace_macros($t, array(
-               '$submit' => t('Save Settings'),
-                                                               // name, label, value, help, [extra values]
-               '$client_id' => array('client_id', t('Client ID'),  get_config('buffer', 'client_id' ), ''),
-               '$client_secret' => array('client_secret', t('Client Secret'),  get_config('buffer', 'client_secret' ), ''),
-       ));
+       $o = replace_macros($t, [
+               '$submit' => L10n::t('Save Settings'),
+               // name, label, value, help, [extra values]
+               '$client_id' => ['client_id', L10n::t('Client ID'), Config::get('buffer', 'client_id'), ''],
+               '$client_secret' => ['client_secret', L10n::t('Client Secret'), Config::get('buffer', 'client_secret'), ''],
+       ]);
 }
-function buffer_plugin_admin_post(&$a){
-        $client_id     =       ((x($_POST,'client_id'))              ? notags(trim($_POST['client_id']))   : '');
-        $client_secret =       ((x($_POST,'client_secret'))   ? notags(trim($_POST['client_secret'])): '');
-        set_config('buffer','client_id',$client_id);
-        set_config('buffer','client_secret',$client_secret);
-        info( t('Settings updated.'). EOL );
+function buffer_addon_admin_post(&$a)
+{
+       $client_id     =       ((x($_POST, 'client_id'))              ? notags(trim($_POST['client_id']))   : '');
+       $client_secret =       ((x($_POST, 'client_secret'))   ? notags(trim($_POST['client_secret'])): '');
+       Config::set('buffer', 'client_id', $client_id);
+       Config::set('buffer', 'client_secret', $client_secret);
+       info(L10n::t('Settings updated.'). EOL);
 }
 
 function buffer_connect(&$a) {
 
        if (isset($_REQUEST["error"])) {
-               $o = t('Error when registering buffer connection:')." ".$_REQUEST["error"];
+               $o = L10n::t('Error when registering buffer connection:')." ".$_REQUEST["error"];
                return $o;
        }
        // Start a session.  This is necessary to hold on to  a few keys the callback script will also need
@@ -90,9 +100,9 @@ function buffer_connect(&$a) {
                $o .= '<a href="' . $buffer->get_login_url() . '">Connect to Buffer!</a>';
        } else {
                logger("buffer_connect: authenticated");
-               $o .= t("You are now authenticated to buffer. ");
-               $o .= '<br /><a href="'.$a->get_baseurl().'/settings/connectors">'.t("return to the connector page").'</a>';
-               set_pconfig(local_user(), 'buffer','access_token', $buffer->access_token);
+               $o .= L10n::t("You are now authenticated to buffer. ");
+               $o .= '<br /><a href="'.$a->get_baseurl().'/settings/connectors">'.L10n::t("return to the connector page").'</a>';
+               PConfig::set(local_user(), 'buffer','access_token', $buffer->access_token);
        }
 
        return($o);
@@ -107,7 +117,7 @@ function buffer_jot_nets(&$a,&$b) {
                $buffer_defpost = get_pconfig(local_user(),'buffer','post_by_default');
                $selected = ((intval($buffer_defpost) == 1) ? ' checked="checked" ' : '');
                $b .= '<div class="profile-jot-net"><input type="checkbox" name="buffer_enable"' . $selected . ' value="1" /> '
-                   . t('Post to Buffer') . '</div>';
+                   . L10n::t('Post to Buffer') . '</div>';
        }
 }
 
@@ -132,11 +142,11 @@ function buffer_settings(&$a,&$s) {
        /* Add some HTML to the existing form */
 
        $s .= '<span id="settings_buffer_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_buffer_expanded\'); openClose(\'settings_buffer_inflated\');">';
-       $s .= '<img class="connector'.$css.'" src="images/buffer.png" /><h3 class="connector">'. t('Buffer Export').'</h3>';
+       $s .= '<img class="connector'.$css.'" src="images/buffer.png" /><h3 class="connector">'. L10n::t('Buffer Export').'</h3>';
        $s .= '</span>';
        $s .= '<div id="settings_buffer_expanded" class="settings-block" style="display: none;">';
        $s .= '<span class="fakelink" onclick="openClose(\'settings_buffer_expanded\'); openClose(\'settings_buffer_inflated\');">';
-       $s .= '<img class="connector'.$css.'" src="images/buffer.png" /><h3 class="connector">'. t('Buffer Export').'</h3>';
+       $s .= '<img class="connector'.$css.'" src="images/buffer.png" /><h3 class="connector">'. L10n::t('Buffer Export').'</h3>';
        $s .= '</span>';
 
        $client_id = get_config("buffer", "client_id");
@@ -146,21 +156,21 @@ function buffer_settings(&$a,&$s) {
        $s .= '<div id="buffer-password-wrapper">';
        if ($access_token == "") {
                $s .= '<div id="buffer-authenticate-wrapper">';
-               $s .= '<a href="'.$a->get_baseurl().'/buffer/connect">'.t("Authenticate your Buffer connection").'</a>';
+               $s .= '<a href="'.$a->get_baseurl().'/buffer/connect">'.L10n::t("Authenticate your Buffer connection").'</a>';
                $s .= '</div><div class="clear"></div>';
        } else {
                $s .= '<div id="buffer-enable-wrapper">';
-               $s .= '<label id="buffer-enable-label" for="buffer-checkbox">' . t('Enable Buffer Post Plugin') . '</label>';
+               $s .= '<label id="buffer-enable-label" for="buffer-checkbox">' . L10n::t('Enable Buffer Post Addon') . '</label>';
                $s .= '<input id="buffer-checkbox" type="checkbox" name="buffer" value="1" ' . $checked . '/>';
                $s .= '</div><div class="clear"></div>';
 
                $s .= '<div id="buffer-bydefault-wrapper">';
-               $s .= '<label id="buffer-bydefault-label" for="buffer-bydefault">' . t('Post to Buffer by default') . '</label>';
+               $s .= '<label id="buffer-bydefault-label" for="buffer-bydefault">' . L10n::t('Post to Buffer by default') . '</label>';
                $s .= '<input id="buffer-bydefault" type="checkbox" name="buffer_bydefault" value="1" ' . $def_checked . '/>';
                $s .= '</div><div class="clear"></div>';
 
                $s .= '<div id="buffer-delete-wrapper">';
-               $s .= '<label id="buffer-delete-label" for="buffer-delete">' . t('Check to delete this preset') . '</label>';
+               $s .= '<label id="buffer-delete-label" for="buffer-delete">' . L10n::t('Check to delete this preset') . '</label>';
                $s .= '<input id="buffer-delete" type="checkbox" name="buffer_delete" value="1" />';
                $s .= '</div><div class="clear"></div>';
 
@@ -169,7 +179,7 @@ function buffer_settings(&$a,&$s) {
                $profiles = $buffer->go('/profiles');
                if (is_array($profiles)) {
                        $s .= '<div id="buffer-accounts-wrapper">';
-                       $s .= t("Posts are going to all accounts that are enabled by default:");
+                       $s .= L10n::t("Posts are going to all accounts that are enabled by default:");
                        $s .= "<ul>";
                        foreach ($profiles as $profile) {
                                if (!$profile->default)
@@ -189,7 +199,7 @@ function buffer_settings(&$a,&$s) {
 
        /* provide a submit button */
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="buffer-submit" name="buffer-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="buffer-submit" name="buffer-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
 }
 
@@ -252,12 +262,9 @@ function buffer_send(&$a,&$b) {
        $client_secret = get_config("buffer", "client_secret");
        $access_token = get_pconfig($b['uid'], "buffer","access_token");
 
-       if($access_token) {
+       if ($access_token) {
                $buffer = new BufferApp($client_id, $client_secret, $callback_url, $access_token);
 
-               require_once("include/plaintext.php");
-               require_once("include/network.php");
-
                $profiles = $buffer->go('/profiles');
                if (is_array($profiles)) {
                        logger("Will send these parameter ".print_r($b, true), LOGGER_DEBUG);
@@ -321,7 +328,7 @@ function buffer_send(&$a,&$b) {
                                        $item["body"] = preg_replace("(\[s\](.*?)\[\/s\])ism",'-$1-',$item["body"]);
                                }
 
-                               $post = plaintext($a, $item, $limit, $includedlinks, $htmlmode);
+                               $post = BBCode::toPlaintext($item, $limit, $includedlinks, $htmlmode);
                                logger("buffer_send: converted message ".$b["id"]." result: ".print_r($post, true), LOGGER_DEBUG);
 
                                // The image proxy is used as a sanitizer. Buffer seems to be really picky about pictures
@@ -334,11 +341,11 @@ function buffer_send(&$a,&$b) {
 
                                //if ($includedlinks) {
                                //      if (isset($post["url"]))
-                               //              $post["url"] = short_link($post["url"]);
+                               //              $post["url"] = Network::shortenUrl($post["url"]);
                                //      if (isset($post["image"]))
-                               //              $post["image"] = short_link($post["image"]);
+                               //              $post["image"] = Network::shortenUrl($post["image"]);
                                //      if (isset($post["preview"]))
-                               //              $post["preview"] = short_link($post["preview"]);
+                               //              $post["preview"] = Network::shortenUrl($post["preview"]);
                                //}
 
                                // Seems like a bug to me
@@ -347,8 +354,8 @@ function buffer_send(&$a,&$b) {
                                if (($profile->service == "twitter") && isset($post["url"]) && ($post["type"] != "photo"))
                                        $post["text"] .= " ".$post["url"];
                                elseif (($profile->service == "appdotnet") && isset($post["url"]) && isset($post["title"]) && ($post["type"] != "photo")) {
-                                       $post["title"] = shortenmsg($post["title"], 90);
-                                       $post["text"] = shortenmsg($post["text"], $limit - (24 + strlen($post["title"])));
+                                       $post["title"] = Plaintext::shorten($post["title"], 90);
+                                       $post["text"] = Plaintext::shorten($post["text"], $limit - (24 + strlen($post["title"])));
                                        $post["text"] .= "\n[".$post["title"]."](".$post["url"].")";
                                } elseif (($profile->service == "appdotnet") && isset($post["url"]) && ($post["type"] != "photo"))
                                        $post["text"] .= " ".$post["url"];
index 17522ebefd0005fb84db3767178a44e659475607..3d5193379389398a2f686a812366b738351a21fb 100644 (file)
@@ -58,7 +58,7 @@ msgid "Authenticate your Buffer connection"
 msgstr ""
 
 #: buffer.php:146
-msgid "Enable Buffer Post Plugin"
+msgid "Enable Buffer Post Addon"
 msgstr ""
 
 #: buffer.php:151
index 7ec1390b618a7f7e6f451c1e43acd7c1e310016f..63e753b0e28b56bb61490e2493a32afbacdbd46f 100644 (file)
@@ -60,8 +60,8 @@ msgid "Authenticate your Buffer connection"
 msgstr "Přihlásit ke spojení na Buffer"
 
 #: buffer.php:146
-msgid "Enable Buffer Post Plugin"
-msgstr "Povolit Buffer Post Plugin"
+msgid "Enable Buffer Post Addon"
+msgstr "Povolit Buffer Post Addon"
 
 #: buffer.php:151
 msgid "Post to Buffer by default"
index 052b3e8efa55fe0ef5b1ed66f84f296967fc23d7..f6ecd1e34e366fd6524ec694442f23d0f2539bc4 100644 (file)
@@ -15,7 +15,7 @@ $a->strings["return to the connector page"] = "návrat ke stránce konektor";
 $a->strings["Post to Buffer"] = "Příspěvek na Buffer";
 $a->strings["Buffer Export"] = "Buffer Export";
 $a->strings["Authenticate your Buffer connection"] = "Přihlásit ke spojení na Buffer";
-$a->strings["Enable Buffer Post Plugin"] = "Povolit Buffer Post Plugin";
+$a->strings["Enable Buffer Post Addon"] = "Povolit Buffer Post Addon";
 $a->strings["Post to Buffer by default"] = "Defaultně zaslat na Buffer";
 $a->strings["Check to delete this preset"] = "Zaškrtnout pro smazání tohoto nastavení";
 $a->strings["Posts are going to all accounts that are enabled by default:"] = "Příspěvky jsou zasílány na všechny účty, které jsou defaultně povoleny:";
index 21bbdda1fb8f859d410e694de290bc0f9ec98033..a252d87c2976db387729905f2b11f880500ad900 100644 (file)
@@ -60,8 +60,8 @@ msgid "Authenticate your Buffer connection"
 msgstr "Authentifiziere deine Verbindung zu buffer"
 
 #: buffer.php:146
-msgid "Enable Buffer Post Plugin"
-msgstr "Buffer Post-Plugin aktivieren"
+msgid "Enable Buffer Post Addon"
+msgstr "Buffer Post-Addon aktivieren"
 
 #: buffer.php:151
 msgid "Post to Buffer by default"
index 4ddbf1e977f5ede0900743be75b6a73e5b431c35..dbf3f7dc4505e5de00fab06de844f515458a7394 100644 (file)
@@ -15,7 +15,7 @@ $a->strings["return to the connector page"] = "zurück zur Connector Seite";
 $a->strings["Post to Buffer"] = "Auf buffer veröffentlichen";
 $a->strings["Buffer Export"] = "Buffer Export";
 $a->strings["Authenticate your Buffer connection"] = "Authentifiziere deine Verbindung zu buffer";
-$a->strings["Enable Buffer Post Plugin"] = "Buffer Post-Plugin aktivieren";
+$a->strings["Enable Buffer Post Addon"] = "Buffer Post-Addon aktivieren";
 $a->strings["Post to Buffer by default"] = "Standardmäßig auf buffer veröffentlichen";
 $a->strings["Check to delete this preset"] = "Markieren um dieses Preset zu löschen";
 $a->strings["Posts are going to all accounts that are enabled by default:"] = "Beiträge werden an alle Accounts geschickt, die Standardmäßig aktiviert sind.";
index 20ceacaed55c25c512a5515e83571ff715839be1..7a40dd46d8adeebd56dd9031234dc7bcc517036f 100644 (file)
@@ -59,8 +59,8 @@ msgid "Authenticate your Buffer connection"
 msgstr "Autenticar su conexión de Buffer"
 
 #: buffer.php:146
-msgid "Enable Buffer Post Plugin"
-msgstr "Active el plugin de publicación de Buffer"
+msgid "Enable Buffer Post Addon"
+msgstr "Active el addon de publicación de Buffer"
 
 #: buffer.php:151
 msgid "Post to Buffer by default"
index 15c58cd1b41191d9dd5f5e50b59a6b3b9618f96c..0ee13d76157a3d9e5d6ccc7243307033f991d449 100644 (file)
@@ -15,7 +15,7 @@ $a->strings["return to the connector page"] = "Vuelva a la página de conexión"
 $a->strings["Post to Buffer"] = "Publique en Buffer";
 $a->strings["Buffer Export"] = "Exportar Buffer";
 $a->strings["Authenticate your Buffer connection"] = "Autenticar su conexión de Buffer";
-$a->strings["Enable Buffer Post Plugin"] = "Active el plugin de publicación de Buffer";
+$a->strings["Enable Buffer Post Addon"] = "Active el addon de publicación de Buffer";
 $a->strings["Post to Buffer by default"] = "Publicar en Buffer por defecto";
 $a->strings["Check to delete this preset"] = "Verificar para eliminar este preajuste";
 $a->strings["Posts are going to all accounts that are enabled by default:"] = "Las publicaciones van a todas las cuentas que estén habilitadas por defecto";
index bc15934111698fa06cfe8ef2b1fabf8429e7e895..5ba45daad26da839cc567edcdc0cdd2cce59981d 100644 (file)
@@ -62,7 +62,7 @@ msgid "Authenticate your Buffer connection"
 msgstr "Authentifier votre connexion à Buffer"
 
 #: buffer.php:146
-msgid "Enable Buffer Post Plugin"
+msgid "Enable Buffer Post Addon"
 msgstr "Activer le connecteur Buffer"
 
 #: buffer.php:151
index 07460f47207f0cac3df49b8bd7a00366cadda2c8..f86822c5f4003bfaa1605fab64b8a23f7ad22738 100644 (file)
@@ -15,7 +15,7 @@ $a->strings["return to the connector page"] = "revenir à la page du connecteur"
 $a->strings["Post to Buffer"] = "Publier sur Buffer";
 $a->strings["Buffer Export"] = "Export Buffer";
 $a->strings["Authenticate your Buffer connection"] = "Authentifier votre connexion à Buffer";
-$a->strings["Enable Buffer Post Plugin"] = "Activer le connecteur Buffer";
+$a->strings["Enable Buffer Post Addon"] = "Activer le connecteur Buffer";
 $a->strings["Post to Buffer by default"] = "Publier sur Buffer par défaut";
 $a->strings["Check to delete this preset"] = "Cocher pour supprimer ce préréglage";
 $a->strings["Posts are going to all accounts that are enabled by default:"] = "Les posts sont envoyés à tous les comptes activés par défault:";
index 232cd2d61bfbc6beaca196e60d02f21930c50c46..6f4c94c2a4dae446a4aede3ef8646caf2f7650b5 100644 (file)
@@ -4,15 +4,15 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
 # Sandro Santilli <strk@kbt.io>, 2015
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-06-22 13:18+0200\n"
-"PO-Revision-Date: 2015-11-01 11:05+0000\n"
-"Last-Translator: Sandro Santilli <strk@kbt.io>\n"
+"PO-Revision-Date: 2018-03-19 13:21+0000\n"
+"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -61,8 +61,8 @@ msgid "Authenticate your Buffer connection"
 msgstr "Autentica la tua connessione a Buffer"
 
 #: buffer.php:146
-msgid "Enable Buffer Post Plugin"
-msgstr "Abilita il plugin di invio a Buffer"
+msgid "Enable Buffer Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio a Buffer"
 
 #: buffer.php:151
 msgid "Post to Buffer by default"
index 9081af8a59d548afb8180ad5e628e48affcad0d9..02fa328b6a0154aadfc575817f51c7dd5277d7f0 100644 (file)
@@ -15,7 +15,7 @@ $a->strings["return to the connector page"] = "ritorna alla pagina del connettor
 $a->strings["Post to Buffer"] = "Invia a Buffer";
 $a->strings["Buffer Export"] = "Esporta Buffer";
 $a->strings["Authenticate your Buffer connection"] = "Autentica la tua connessione a Buffer";
-$a->strings["Enable Buffer Post Plugin"] = "Abilita il plugin di invio a Buffer";
+$a->strings["Enable Buffer Post Addon"] = "Abilita il componente aggiuntivo di invio a Buffer";
 $a->strings["Post to Buffer by default"] = "Invia sempre a Buffer";
 $a->strings["Check to delete this preset"] = "Seleziona per eliminare questo preset";
 $a->strings["Posts are going to all accounts that are enabled by default:"] = "I messaggi andranno a tutti gli account che sono abilitati:";
index 08884bd41f38849ca5b8500b01f65beaa607664f..795f26429f7051a6ff8c7963c1d3875a287909c5 100644 (file)
@@ -61,8 +61,8 @@ msgid "Authenticate your Buffer connection"
 msgstr "Autenticar sua conexão de Buffer"
 
 #: buffer.php:146
-msgid "Enable Buffer Post Plugin"
-msgstr "Habilita plugin para publicar no Buffer"
+msgid "Enable Buffer Post Addon"
+msgstr "Habilita addon para publicar no Buffer"
 
 #: buffer.php:151
 msgid "Post to Buffer by default"
index 272a071ef755b2c597ed3b4d9b3da4751ceb51a4..737a86eb6858745ae6cd5ef1d4e749b481ec6f3b 100644 (file)
@@ -15,7 +15,7 @@ $a->strings["return to the connector page"] = "Volte a página de conectores.";
 $a->strings["Post to Buffer"] = "Publicar no Buffer";
 $a->strings["Buffer Export"] = "Exportar Buffer";
 $a->strings["Authenticate your Buffer connection"] = "Autenticar sua conexão de Buffer";
-$a->strings["Enable Buffer Post Plugin"] = "Habilita plugin para publicar no Buffer";
+$a->strings["Enable Buffer Post Addon"] = "Habilita addon para publicar no Buffer";
 $a->strings["Post to Buffer by default"] = "Publica no Buffer por padrão";
 $a->strings["Check to delete this preset"] = "Marque para excluir este perfil";
 $a->strings["Posts are going to all accounts that are enabled by default:"] = "";
index 383390aac17d82b498e19b5c7493d945469daa53..81e46a5ab2c44320543fb7c869a4cadaf9cedd48 100644 (file)
@@ -59,7 +59,7 @@ msgid "Authenticate your Buffer connection"
 msgstr "Autentificați-vă conectarea la Buffer"
 
 #: buffer.php:146
-msgid "Enable Buffer Post Plugin"
+msgid "Enable Buffer Post Addon"
 msgstr "Activare Modul Postare pe Buffer"
 
 #: buffer.php:151
index 7e7e575feb6a53b8c38e6f4e15ec701e3a8f7883..a6bda064d5b1aa296ba83225e388cf69a08529ec 100644 (file)
@@ -15,7 +15,7 @@ $a->strings["return to the connector page"] = "revenire la pagina de conectare";
 $a->strings["Post to Buffer"] = "Postați pe Buffer";
 $a->strings["Buffer Export"] = "Export pe Buffer ";
 $a->strings["Authenticate your Buffer connection"] = "Autentificați-vă conectarea la Buffer";
-$a->strings["Enable Buffer Post Plugin"] = "Activare Modul Postare pe Buffer";
+$a->strings["Enable Buffer Post Addon"] = "Activare Modul Postare pe Buffer";
 $a->strings["Post to Buffer by default"] = "Postați implicit pe Buffer";
 $a->strings["Check to delete this preset"] = "Bifați pentru a șterge această presetare";
 $a->strings["Posts are going to all accounts that are enabled by default:"] = "Posturile merg către toate conturile care sunt activate implicit:";
index 84e2531c344f174c2f08df3f69c9485a63f550d8..68107abc1164358235d5c2d87c1db7a6c8c8b57b 100644 (file)
@@ -60,7 +60,7 @@ msgid "Authenticate your Buffer connection"
 msgstr "Аутентифицируйте свое соединение с Buffer"
 
 #: buffer.php:146
-msgid "Enable Buffer Post Plugin"
+msgid "Enable Buffer Post Addon"
 msgstr "Включить плагин Buffer"
 
 #: buffer.php:151
index 9b8bd0414f6cac4c6b2db21d1a0370e960893a01..8572ffd6658f468fc5db1d81dd7dd85f86169158 100644 (file)
@@ -15,7 +15,7 @@ $a->strings["return to the connector page"] = "вернуться на стра
 $a->strings["Post to Buffer"] = "Написать в Buffer";
 $a->strings["Buffer Export"] = "Экспорт в Buffer";
 $a->strings["Authenticate your Buffer connection"] = "Аутентифицируйте свое соединение с Buffer";
-$a->strings["Enable Buffer Post Plugin"] = "Включить плагин Buffer";
+$a->strings["Enable Buffer Post Addon"] = "Включить плагин Buffer";
 $a->strings["Post to Buffer by default"] = "Отправлять в Buffer по умолчанию";
 $a->strings["Check to delete this preset"] = "Отметьте для удаления этих настроек";
 $a->strings["Posts are going to all accounts that are enabled by default:"] = "Сообщения уходят во все учетные записи по умолчанию:";
index 06eaddbb6a939032b66252759b23877449d3c1b2..71c22a673cc458605269dd5972d3bb8f27e5eb04 100644 (file)
@@ -5,11 +5,20 @@
  * Version: 1.0
  * Author: Mike Macgirvin <mike@macgirvin.com>
  */
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
 
+function buglink_install()
+{
+       Addon::registerHook('page_end', 'addon/buglink/buglink.php', 'buglink_active');
+}
 
-function buglink_install() { register_hook('page_end', 'addon/buglink/buglink.php', 'buglink_active'); }
+function buglink_uninstall()
+{
+       Addon::unregisterHook('page_end', 'addon/buglink/buglink.php', 'buglink_active');
+}
 
-
-function buglink_uninstall() { unregister_hook('page_end', 'addon/buglink/buglink.php', 'buglink_active'); }
-
-function buglink_active(&$a,&$b) { $b .= '<div id="buglink_wrapper" style="position: fixed; bottom: 5px; left: 5px;"><a href="https://github.com/friendica/friendica/issues" target="_blank" title="' . t('Report Bug') . '"><img src="addon/buglink/bug-x.gif" alt="' . t('Report Bug') . '" /></a></div>'; } 
+function buglink_active(&$a, &$b)
+{
+       $b .= '<div id="buglink_wrapper" style="position: fixed; bottom: 5px; left: 5px;"><a href="https://github.com/friendica/friendica/issues" target="_blank" title="' . L10n::t('Report Bug') . '"><img src="addon/buglink/bug-x.gif" alt="' . L10n::t('Report Bug') . '" /></a></div>';
+}
index 63e643ea963e1054bf2c3800849ca8efd827710a..de10cb94a7b62a6faf154c820797f49a30f99ef1 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-06-22 13:18+0200\n"
-"PO-Revision-Date: 2014-09-10 10:27+0000\n"
+"PO-Revision-Date: 2017-09-20 06:07+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index a299d45e94b518a5f9005d75f8e2ca2f9e0b270e..176ade85730e60ca58b73c84175aa946fbdd4fb3 100644 (file)
@@ -5,14 +5,14 @@
  * Version: 1.0\r
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>\r
  */\r
-\r
+use Friendica\Core\Addon;\r
 \r
 function calc_install() {\r
-       register_hook('app_menu', 'addon/calc/calc.php', 'calc_app_menu');\r
+       Addon::registerHook('app_menu', 'addon/calc/calc.php', 'calc_app_menu');\r
 }\r
 \r
 function calc_uninstall() {\r
-       unregister_hook('app_menu', 'addon/calc/calc.php', 'calc_app_menu');\r
+       Addon::unregisterHook('app_menu', 'addon/calc/calc.php', 'calc_app_menu');\r
 \r
 }\r
 \r
index 21f2a9465f97389ea0d36325c93721e3e72ccdfe..61bbc99a8d27a0a8570d0b0db6bc2938d3781fe1 100644 (file)
@@ -1,34 +1,17 @@
 Community Home
 --------------
 
-This plugin overwrites the default home page shown to not logged users.
-On sidebar there are the login form, last ten users (if they have 
-choosed to be in site directory), last ten public photos and last ten
-"likes" sent by a site user or about a site user's item
+This addon overwrites the default home page shown to anonymous users.
+On the sidebar there are the login form, last ten users (if they chose
+to be in the site directory), last ten public photos and last ten
+"likes" sent by a site user or about a site user's item.
 
-In main content is shown the community stream. This plugin doesn't 
-honour your community page visibility site setting: the community 
+In the main content is shown the community stream. This addon doesn't
+honor your community page visibility site setting: the community
 stream is shown also if you have choose to not show the community page.
 
-If 'home.html' is found in your friendica root, its content is inserted 
+If 'home.html' is found in your friendica root, its content is inserted
 before community stream
 
-Each elements can be show or not. At the moment, there is no admin page
-for settings, so this settings must be added to yout .htconfig.php
-
-
-    $a->config['communityhome']['showcommunitystream'] = true;
-    $a->config['communityhome']['showlastlike'] = true;
-    $a->config['communityhome']['showlastphotos'] = true;
-    $a->config['communityhome']['showactiveusers'] = true;
-    $a->config['communityhome']['showlastusers'] = true;
-
-If you don't want to show something, set it to false.
-
-Note:
------
-
-- Default is "false". With no settings in .htconfig.php, nothing is 
-shown, except login form and content of 'home.html'
-
-- Active users query can be heavy for db, and on some system don't work
+By default no features are enabled, you can edit this addon's settings
+through the admin panel.
\ No newline at end of file
index 45a65537487994063ffab79fdcfe09ccb1c04cf0..09da8ea2cdb7ecff29c519e048d29fad1ef92d4d 100644 (file)
@@ -41,3 +41,8 @@ aside #likes { margin: 0px; padding: 0px; list-style: none; }
 
 aside #div_id_remember { overflow: auto;       width: 100%; padding-top:120px;}
 #login_openid input { width: 160px; }
+
+/* frio fix */
+body.mod-home .navbar.navbar-fixed-top ul.nav.navbar-nav #nav-login {
+       display: block;
+}
index ff3215d36aa00aaf64fe203ddd8de8847d0d7aef..f2908ab0e38d6cad4fdc7a0da6ce6df6b49eff06 100644 (file)
 <?php
+
 /**
  * Name: Community home
  * Description: Show last community activity in homepage
  * Version: 2.0
  * Author: Fabio Comuni <http://kirgroup.com/profile/fabrixxm>
+ * Status: Unsupported
  */
 
+use Friendica\App;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Module\Login;
 
-require_once('mod/community.php');
-
+require_once 'mod/community.php';
 
-function communityhome_install() {
-       register_hook('home_content', 'addon/communityhome/communityhome.php', 'communityhome_home');
+function communityhome_install()
+{
+       Addon::registerHook('home_content', 'addon/communityhome/communityhome.php', 'communityhome_home');
        logger("installed communityhome");
 }
 
-function communityhome_uninstall() {
-       unregister_hook('home_content', 'addon/communityhome/communityhome.php', 'communityhome_home');
+function communityhome_uninstall()
+{
+       Addon::unregisterHook('home_content', 'addon/communityhome/communityhome.php', 'communityhome_home');
        logger("removed communityhome");
 }
 
-function communityhome_home(&$a, &$o){
+function communityhome_getopts()
+{
+       return [
+               'hidelogin' => L10n::t('Hide login form'),
+               'showlastusers' => L10n::t('Show last new users'),
+               'showlastphotos' => L10n::t('Show last photos'),
+               'showlastlike' => L10n::t('Show last liked items'),
+               'showcommunitystream' => L10n::t('Show community stream')
+       ];
+}
+
+function communityhome_addon_admin(App $a, &$o)
+{
+       $tpl = get_markup_template('settings.tpl', 'addon/communityhome/');
+
+       $opts = communityhome_getopts();
+       $ctx = [
+               '$submit' => L10n::t("Submit"),
+               '$fields' => [],
+       ];
+
+       foreach ($opts as $k => $v) {
+               $ctx['fields'][] = ['communityhome_' . $k, $v, Config::get('communityhome', $k)];
+       }
+       $o = replace_macros($tpl, $ctx);
+}
+
+function communityhome_addon_admin_post(App $a)
+{
+       if (x($_POST, 'communityhome-submit')) {
+               $opts = communityhome_getopts();
+               foreach ($opts as $k => $v) {
+                       Config::set('communityhome', $k, x($_POST, 'communityhome_' . $k));
+               }
+       }
+}
+
+function communityhome_home(App $a, &$o)
+{
        // custom css
-       $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'.$a->get_baseurl().'/addon/communityhome/communityhome.css" media="all" />';
+       $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/communityhome/communityhome.css" media="all" />';
 
-       if (!get_config('communityhome','hidelogin')){
-               $aside = array(
-                       '$tab_1' => t('Login'),
-                       '$tab_2' => t('OpenID'),
-                       '$noOid' => get_config('system','no_openid'),
-               );
+       if (!Config::get('communityhome', 'hidelogin')) {
+               $aside = [
+                       '$tab_1' => L10n::t('Login'),
+                       '$tab_2' => L10n::t('OpenID'),
+                       '$noOid' => Config::get('system', 'no_openid'),
+               ];
 
                // login form
-               $aside['$login_title'] =  t('Login');
-               $aside['$login_form'] = login(($a->config['register_policy'] == REGISTER_CLOSED) ? false : true);
-       } else
-               $aside = array(
-                       //'$tab_1' => t('Login'),
-                       //'$tab_2' => t('OpenID'),
-                       //'$noOid' => get_config('system','no_openid'),
-               );
+               $aside['$login_title'] = L10n::t('Login');
+               $aside['$login_form'] = Login::form($a->query_string, $a->config['register_policy'] == REGISTER_CLOSED ? false : true);
+       } else {
+               $aside = [
+                       //'$tab_1' => L10n::t('Login'),
+                       //'$tab_2' => L10n::t('OpenID'),
+                       //'$noOid' => Config::get('system','no_openid'),
+               ];
+       }
 
        // last 12 users
-       if (get_config('communityhome','showlastusers')===true){
-               $aside['$lastusers_title'] = t('Latest users');
-               $aside['$lastusers_items'] = array();
+       if (Config::get('communityhome', 'showlastusers')) {
+               $aside['$lastusers_title'] = L10n::t('Latest users');
+               $aside['$lastusers_items'] = [];
                $sql_extra = "";
-               $publish = (get_config('system','publish_all') ? '' : " AND `publish` = 1 " );
+               $publish = (Config::get('system', 'publish_all') ? '' : " AND `publish` = 1 " );
                $order = " ORDER BY `register_date` DESC ";
 
                $r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`
-                               FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` 
-                               WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra $order LIMIT %d , %d ",
+                               FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid`
+                               WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra $order LIMIT %d, %d ",
                        0,
                        12
                );
-       #       $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
-               $tpl = get_markup_template( 'directory_item.tpl', 'addon/communityhome/' );
-               if(count($r)) {
+               #       $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
+               $tpl = get_markup_template('directory_item.tpl', 'addon/communityhome/');
+               if (count($r)) {
                        $photo = 'thumb';
-                       foreach($r as $rr) {
+                       foreach ($r as $rr) {
                                $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
-                               $entry = replace_macros($tpl,array(
+                               $entry = replace_macros($tpl, [
                                        '$id' => $rr['id'],
                                        '$profile_link' => $profile_link,
                                        '$photo' => $a->get_cached_avatar_image($rr[$photo]),
@@ -71,45 +118,13 @@ function communityhome_home(&$a, &$o){
                        }
                }
        }
-       // 12 most active users (by posts and contacts)
-       // this query don't work on some mysql versions
-       if (get_config('communityhome','showactiveusers')===true){
-               $r = q("SELECT `uni`.`contacts`,`uni`.`items`, `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`  FROM
-                               (SELECT COUNT(*) as `contacts`, `uid` FROM `contact` WHERE `self`=0 GROUP BY `uid`) AS `con`,
-                               (SELECT COUNT(*) as `items`, `uid` FROM `item` WHERE `item`.`changed` > DATE(NOW() - INTERVAL 1 MONTH) AND `item`.`wall` = 1 GROUP BY `uid`) AS `ite`,
-                               (
-                               SELECT `contacts`,`items`,`ite`.`uid` FROM `con` RIGHT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid` 
-                               UNION ALL 
-                               SELECT `contacts`,`items`,`con`.`uid` FROM `con` LEFT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid`
-                               ) AS `uni`, `user`, `profile`
-                               WHERE `uni`.`uid`=`user`.`uid`
-                               AND `uni`.`uid`=`profile`.`uid` AND `profile`.`publish`=1
-                               GROUP BY `uid`
-                               ORDER BY `items` DESC,`contacts` DESC
-                               LIMIT 0,10");
-               if($r && count($r)) {
-                       $aside['$activeusers_title']  = t('Most active users');
-                       $aside['$activeusers_items']  = array();
 
-                       $photo = 'thumb';
-                       foreach($r as $rr) {
-                               $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
-                               $entry = replace_macros($tpl,array(
-                                       '$id' => $rr['id'],
-                                       '$profile_link' => $profile_link,
-                                       '$photo' => $rr[$photo],
-                                       '$alt_text' => sprintf("%s (%s posts, %s contacts)",$rr['name'], ($rr['items']?$rr['items']:'0'), ($rr['contacts']?$rr['contacts']:'0'))
-                               ));
-                               $aside['$activeusers_items'][] = $entry;
-                       }
-               }
-       }
        // last 12 photos
-       if (get_config('communityhome','showlastphotos')===true){
-               $aside['$photos_title'] = t('Latest photos');
-               $aside['$photos_items'] = array();
-               $r = q("SELECT `photo`.`id`, `photo`.`resource-id`, `photo`.`scale`, `photo`.`desc`, `user`.`nickname`, `user`.`username` FROM 
-                                       (SELECT `resource-id`, MAX(`scale`) as maxscale FROM `photo` 
+       if (Config::get('communityhome', 'showlastphotos')) {
+               $aside['$photos_title'] = L10n::t('Latest photos');
+               $aside['$photos_items'] = [];
+               $r = q("SELECT `photo`.`id`, `photo`.`resource-id`, `photo`.`scale`, `photo`.`desc`, `user`.`nickname`, `user`.`username` FROM
+                                       (SELECT `resource-id`, MAX(`scale`) as maxscale FROM `photo`
                                                WHERE `profile`=0 AND `contact-id`=0 AND `album` NOT IN ('Contact Photos', '%s', 'Profile Photos', '%s')
                                                        AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`='' GROUP BY `resource-id`) AS `t1`
                                        INNER JOIN `photo` ON `photo`.`resource-id`=`t1`.`resource-id` AND `photo`.`scale` = `t1`.`maxscale`,
@@ -119,19 +134,19 @@ function communityhome_home(&$a, &$o){
                                        AND `user`.`hidewall` = 0
                                        ORDER BY `photo`.`edited` DESC
                                        LIMIT 0, 12",
-                                       dbesc(t('Contact Photos')),
-                                       dbesc(t('Profile Photos'))
-                                       );
+                       dbesc(L10n::t('Contact Photos')),
+                       dbesc(L10n::t('Profile Photos'))
+               );
 
 
-               if(count($r)) {
-       #               $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
-                       $tpl = get_markup_template( 'directory_item.tpl', 'addon/communityhome/' );
-                       foreach($r as $rr) {
+               if (count($r)) {
+                       #               $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
+                       $tpl = get_markup_template('directory_item.tpl', 'addon/communityhome/');
+                       foreach ($r as $rr) {
                                $photo_page = $a->get_baseurl() . '/photos/' . $rr['nickname'] . '/image/' . $rr['resource-id'];
-                               $photo_url = $a->get_baseurl() . '/photo/' .  $rr['resource-id'] . '-' . $rr['scale'] .'.jpg';
+                               $photo_url  = $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . $rr['scale'] . '.jpg';
 
-                               $entry = replace_macros($tpl,array(
+                               $entry = replace_macros($tpl, [
                                        '$id' => $rr['id'],
                                        '$profile_link' => $photo_page,
                                        '$photo' => $photo_url,
@@ -144,48 +159,49 @@ function communityhome_home(&$a, &$o){
        }
 
        // last 10 liked items
-       if (get_config('communityhome','showlastlike')===true){
-               $aside['$like_title'] = t('Latest likes');
-               $aside['$like_items'] = array();
-               $r = q("SELECT `T1`.`created`, `T1`.`liker`, `T1`.`liker-link`, `item`.* FROM 
-                               (SELECT `parent-uri`, `created`, `author-name` AS `liker`,`author-link` AS `liker-link` 
+       if (Config::get('communityhome', 'showlastlike')) {
+               $aside['$like_title'] = L10n::t('Latest likes');
+               $aside['$like_items'] = [];
+               $r = q("SELECT `T1`.`created`, `T1`.`liker`, `T1`.`liker-link`, `item`.* FROM
+                               (SELECT `parent-uri`, `created`, `author-name` AS `liker`,`author-link` AS `liker-link`
                                        FROM `item` WHERE `verb`='http://activitystrea.ms/schema/1.0/like' GROUP BY `parent-uri` ORDER BY `created` DESC) AS T1
                                INNER JOIN `item` ON `item`.`uri`=`T1`.`parent-uri` 
                                WHERE `T1`.`liker-link` LIKE '%s%%' OR `item`.`author-link` LIKE '%s%%'
                                GROUP BY `uri`
                                ORDER BY `T1`.`created` DESC
                                LIMIT 0,10",
-                               $a->get_baseurl(),$a->get_baseurl()
-                               );
+                       $a->get_baseurl(),
+                       $a->get_baseurl()
+               );
 
                foreach ($r as $rr) {
-                       $author  = '<a href="' . $rr['liker-link'] . '">' . $rr['liker'] . '</a>';
-                       $objauthor =  '<a href="' . $rr['author-link'] . '">' . $rr['author-name'] . '</a>';
+                       $author = '<a href="' . $rr['liker-link'] . '">' . $rr['liker'] . '</a>';
+                       $objauthor = '<a href="' . $rr['author-link'] . '">' . $rr['author-name'] . '</a>';
 
                        //var_dump($rr['verb'],$rr['object-type']); killme();
-                       switch($rr['verb']){
+                       switch ($rr['verb']) {
                                case 'http://activitystrea.ms/schema/1.0/post':
-                                       switch ($rr['object-type']){
+                                       switch ($rr['object-type']) {
                                                case 'http://activitystrea.ms/schema/1.0/event':
-                                                       $post_type = t('event');
+                                                       $post_type = L10n::t('event');
                                                        break;
                                                default:
-                                                       $post_type = t('status');
+                                                       $post_type = L10n::t('status');
                                        }
                                        break;
                                default:
-                                       if ($rr['resource-id']){
-                                               $post_type = t('photo');
-                                               $m=array();     preg_match("/\[url=([^]]*)\]/", $rr['body'], $m);
+                                       if ($rr['resource-id']) {
+                                               $post_type = L10n::t('photo');
+                                               $m = [];
+                                               preg_match("/\[url=([^]]*)\]/", $rr['body'], $m);
                                                $rr['plink'] = $m[1];
                                        } else {
-                                               $post_type = t('status');
+                                               $post_type = L10n::t('status');
                                        }
                        }
                        $plink = '<a href="' . $rr['plink'] . '">' . $post_type . '</a>';
 
-                       $aside['$like_items'][] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink);
-
+                       $aside['$like_items'][] = L10n::t('%1$s likes %2$s\'s %3$s', $author, $objauthor, $plink);
                }
        }
 
@@ -193,19 +209,16 @@ function communityhome_home(&$a, &$o){
        $tpl = get_markup_template('communityhome.tpl', 'addon/communityhome/');
        $a->page['aside'] = replace_macros($tpl, $aside);
 
-       $o = '<h1>' . ((x($a->config,'sitename')) ? sprintf( t("Welcome to %s") ,$a->config['sitename']) : "" ) . '</h1>';
+       $o = '<h1>' . ((x($a->config, 'sitename')) ? L10n::t("Welcome to %s", $a->config['sitename']) : "" ) . '</h1>';
 
-       if(file_exists('home.html'))
-               $o = file_get_contents('home.html');
+       if (file_exists('home.html')) $o = file_get_contents('home.html');
 
-       if (get_config('communityhome','showcommunitystream')===true){
-               $oldset = get_config('system','community_page_style');
-               if ($oldset == CP_NO_COMMUNITY_PAGE)
-                       set_config('system','community_page_style', CP_USERS_ON_SERVER);
+       if (Config::get('communityhome', 'showcommunitystream')) {
+               $oldset = Config::get('system', 'community_page_style');
+               if ($oldset == CP_NO_COMMUNITY_PAGE) Config::set('system', 'community_page_style', CP_USERS_ON_SERVER);
 
-               $o .= community_content($a,1);
+               $o .= community_content($a, 1);
 
-               if ($oldset == CP_NO_COMMUNITY_PAGE)
-                       set_config('system','community_page_style', $oldset);
+               if ($oldset == CP_NO_COMMUNITY_PAGE) Config::set('system', 'community_page_style', $oldset);
        }
 }
index 639615130e91cbc190e1cbfd8190f9f09bcf3e60..808cc6324235743d65324fc42269565d42e76508 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-09-10 10:30+0000\n"
+"PO-Revision-Date: 2017-09-20 06:07+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index b8f80381f17099e8405fcba2e437735278216213..c2e458be42037f6aabc79e964b67943e4431f4b5 100644 (file)
@@ -15,9 +15,9 @@
                        $("#tab_1").removeClass("active");
                        e.preventDefault();
                        return false;
-                       
+
                });
-               
+
        });
 </script>
 {{if $noOid}}
 {{/if}}
 
 
-{{if $activeusers_title}}
-<h3>{{$activeusers_title}}</h3>
-<div class='items-wrapper'>
-{{foreach $activeusers_items as $i}}
-       {{$i}}
-{{/foreach}}
-</div>
-{{/if}}
-
 {{if $photos_title}}
 <h3>{{$photos_title}}</h3>
 <div class='items-wrapper'>
index 751316503366b944c8498c4dbc532863fa8c400c..5064d3804fba15bcece6414d12ea12167bf088c0 100644 (file)
@@ -5,13 +5,14 @@
  * Version: 1.0\r
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>\r
  */\r
+use Friendica\Core\Addon;\r
 \r
 function convert_install() {\r
-       register_hook('app_menu', 'addon/convert/convert.php', 'convert_app_menu');\r
+       Addon::registerHook('app_menu', 'addon/convert/convert.php', 'convert_app_menu');\r
 }\r
 \r
 function convert_uninstall() {\r
-       unregister_hook('app_menu', 'addon/convert/convert.php', 'convert_app_menu');\r
+       Addon::unregisterHook('app_menu', 'addon/convert/convert.php', 'convert_app_menu');\r
 }\r
 \r
 function convert_app_menu($a,&$b) {\r
index 71d95e4640cb2fd8443786b1047ef4dd604ba497..82ea2915ffc90e876d42e5705660e8665f7bb438 100644 (file)
@@ -9,9 +9,15 @@
  *
  */
 
-require_once('include/network.php');
-require_once("mod/proxy.php");
-require_once('include/text.php');
+require_once 'mod/proxy.php';
+require_once 'include/text.php';
+
+use Friendica\Core\Addon;
+use Friendica\Core\Cache;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\Network;
 
 //  get the weather data from OpenWeatherMap
 function getWeather( $loc, $units='metric', $lang='en', $appid='', $cachetime=0) {
@@ -26,9 +32,9 @@ function getWeather( $loc, $units='metric', $lang='en', $appid='', $cachetime=0)
        }
     }
     try {
-       $res = new SimpleXMLElement(fetch_url($url));
+       $res = new SimpleXMLElement(Network::fetchUrl($url));
     } catch (Exception $e) {
-       info(t('Error fetching weather data.\nError was: '.$e->getMessage()));
+       info(L10n::t('Error fetching weather data.\nError was: '.$e->getMessage()));
        return false;
     }
     if ((string)$res->temperature['unit']==='metric') {
@@ -61,16 +67,17 @@ function getWeather( $loc, $units='metric', $lang='en', $appid='', $cachetime=0)
     return $r;
 }
 
-function curweather_install() {
-       register_hook('network_mod_init', 'addon/curweather/curweather.php', 'curweather_network_mod_init');
-       register_hook('plugin_settings', 'addon/curweather/curweather.php', 'curweather_plugin_settings');
-       register_hook('plugin_settings_post', 'addon/curweather/curweather.php', 'curweather_plugin_settings_post');
+function curweather_install()
+{
+       Addon::registerHook('network_mod_init', 'addon/curweather/curweather.php', 'curweather_network_mod_init');
+       Addon::registerHook('addon_settings', 'addon/curweather/curweather.php', 'curweather_addon_settings');
+       Addon::registerHook('addon_settings_post', 'addon/curweather/curweather.php', 'curweather_addon_settings_post');
 }
 
 function curweather_uninstall() {
-       unregister_hook('network_mod_init', 'addon/curweather/curweather.php', 'curweather_network_mod_init');
-       unregister_hook('plugin_settings', 'addon/curweather/curweather.php', 'curweather_plugin_settings');
-       unregister_hook('plugin_settings_post', 'addon/curweather/curweather.php', 'curweather_plugin_settings_post');
+       Addon::unregisterHook('network_mod_init', 'addon/curweather/curweather.php', 'curweather_network_mod_init');
+       Addon::unregisterHook('addon_settings', 'addon/curweather/curweather.php', 'curweather_addon_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/curweather/curweather.php', 'curweather_addon_settings_post');
 }
 
 function curweather_network_mod_init(&$fk_app,&$b) {
@@ -107,28 +114,28 @@ function curweather_network_mod_init(&$fk_app,&$b) {
 
     if ($ok) {
        $t = get_markup_template("widget.tpl", "addon/curweather/" );
-       $curweather = replace_macros ($t, array(
-           '$title' => t("Current Weather"),
+       $curweather = replace_macros ($t, [
+           '$title' => L10n::t("Current Weather"),
            '$icon' => proxy_url('http://openweathermap.org/img/w/'.$res['icon'].'.png'),
            '$city' => $res['city'],
            '$lon' => $res['lon'],
            '$lat' => $res['lat'],
            '$description' => $res['descripion'],
            '$temp' => $res['temperature'],
-           '$relhumidity' => array('caption'=>t('Relative Humidity'), 'val'=>$res['humidity']),
-           '$pressure' => array('caption'=>t('Pressure'), 'val'=>$res['pressure']),
-           '$wind' => array('caption'=>t('Wind'), 'val'=> $res['wind']),
-           '$lastupdate' => t('Last Updated').': '.$res['update'].'UTC',
-           '$databy' =>  t('Data by'),
-           '$showonmap' => t('Show on map')
-       ));
+           '$relhumidity' => ['caption'=>L10n::t('Relative Humidity'), 'val'=>$res['humidity']],
+           '$pressure' => ['caption'=>L10n::t('Pressure'), 'val'=>$res['pressure']],
+           '$wind' => ['caption'=>L10n::t('Wind'), 'val'=> $res['wind']],
+           '$lastupdate' => L10n::t('Last Updated').': '.$res['update'].'UTC',
+           '$databy' =>  L10n::t('Data by'),
+           '$showonmap' => L10n::t('Show on map')
+       ]);
     } else {
        $t = get_markup_template('widget-error.tpl', 'addon/curweather/');
-       $curweather = replace_macros( $t, array(
-           '$problem' => t('There was a problem accessing the weather data. But have a look'),
+       $curweather = replace_macros( $t, [
+           '$problem' => L10n::t('There was a problem accessing the weather data. But have a look'),
            '$rpt' => $rpt,
-           '$atOWM' => t('at OpenWeatherMap')
-       ));
+           '$atOWM' => L10n::t('at OpenWeatherMap')
+       ]);
     }
 
     $fk_app->page['aside'] = $curweather.$fk_app->page['aside'];
@@ -136,29 +143,29 @@ function curweather_network_mod_init(&$fk_app,&$b) {
 }
 
 
-function curweather_plugin_settings_post($a,$post) {
+function curweather_addon_settings_post($a,$post) {
        if(! local_user() || (! x($_POST,'curweather-settings-submit')))
                return;
        set_pconfig(local_user(),'curweather','curweather_loc',trim($_POST['curweather_loc']));
        set_pconfig(local_user(),'curweather','curweather_enable',intval($_POST['curweather_enable']));
        set_pconfig(local_user(),'curweather','curweather_units',trim($_POST['curweather_units']));
 
-       info( t('Current Weather settings updated.') . EOL);
+       info(L10n::t('Current Weather settings updated.') . EOL);
 }
 
 
-function curweather_plugin_settings(&$a,&$s) {
+function curweather_addon_settings(&$a,&$s) {
 
        if(! local_user())
                return;
 
        /* Get the current state of our config variable */
 
-       $curweather_loc = get_pconfig(local_user(), 'curweather', 'curweather_loc');
-       $curweather_units = get_pconfig(local_user(), 'curweather', 'curweather_units');
-       $appid = get_config('curweather','appid');
-       if ($appid=="") { 
-               $noappidtext = t('No APPID found, please contact your admin to obtain one.');
+       $curweather_loc = PConfig::get(local_user(), 'curweather', 'curweather_loc');
+       $curweather_units = PConfig::get(local_user(), 'curweather', 'curweather_units');
+       $appid = Config::get('curweather','appid');
+       if ($appid=="") {
+               $noappidtext = L10n::t('No APPID found, please contact your admin to obtain one.');
        } else {
            $noappidtext = '';
        }
@@ -167,38 +174,38 @@ function curweather_plugin_settings(&$a,&$s) {
        
        // load template and replace the macros
        $t = get_markup_template("settings.tpl", "addon/curweather/" );
-       $s = replace_macros ($t, array(
-               '$submit' => t('Save Settings'),            
-               '$header' => t('Current Weather').' '.t('Settings'),
+       $s = replace_macros ($t, [
+               '$submit' => L10n::t('Save Settings'),
+               '$header' => L10n::t('Current Weather').' '.L10n::t('Settings'),
                '$noappidtext' => $noappidtext,
-               '$info' => t('Enter either the name of your location or the zip code.'),
-               '$curweather_loc' => array( 'curweather_loc', t('Your Location'), $curweather_loc, t('Identifier of your location (name or zip code), e.g. <em>Berlin,DE</em> or <em>14476,DE</em>.') ),
-               '$curweather_units' => array( 'curweather_units', t('Units'), $curweather_units, t('select if the temperature should be displayed in &deg;C or &deg;F'), array('metric'=>'°C', 'imperial'=>'°F')),
-               '$enabled' => array( 'curweather_enable', t('Show weather data'), $enable, '')
-           ));
+               '$info' => L10n::t('Enter either the name of your location or the zip code.'),
+               '$curweather_loc' => [ 'curweather_loc', L10n::t('Your Location'), $curweather_loc, L10n::t('Identifier of your location (name or zip code), e.g. <em>Berlin,DE</em> or <em>14476,DE</em>.') ],
+               '$curweather_units' => [ 'curweather_units', L10n::t('Units'), $curweather_units, L10n::t('select if the temperature should be displayed in &deg;C or &deg;F'), ['metric'=>'°C', 'imperial'=>'°F']],
+               '$enabled' => [ 'curweather_enable', L10n::t('Show weather data'), $enable, '']
+           ]);
        return;
 
 }
 // Config stuff for the admin panel to let the admin of the node set a APPID
 // for accessing the API of openweathermap
-function curweather_plugin_admin_post (&$a) {
+function curweather_addon_admin_post (&$a) {
        if(! is_site_admin())
            return;
        if ($_POST['curweather-submit']) {
-           set_config('curweather','appid',trim($_POST['appid']));
-           set_config('curweather','cachetime',trim($_POST['cachetime']));
-           info( t('Curweather settings saved.'.EOL));
+           Config::set('curweather','appid',trim($_POST['appid']));
+           Config::set('curweather','cachetime',trim($_POST['cachetime']));
+           info(L10n::t('Curweather settings saved.'.EOL));
        }
 }
-function curweather_plugin_admin (&$a, &$o) {
+function curweather_addon_admin (&$a, &$o) {
     if(! is_site_admin())
            return;
     $appid = get_config('curweather','appid');
     $cachetime = get_config('curweather','cachetime');
     $t = get_markup_template("admin.tpl", "addon/curweather/" );
-    $o = replace_macros ($t, array(
-       '$submit' => t('Save Settings'),
-       '$cachetime' => array('cachetime', t('Caching Interval'), $cachetime, t('For how long should the weather data be cached? Choose according your OpenWeatherMap account type.'), array('0'=>t('no cache'), '300'=>'5 '.t('minutes'), '900'=>'15 '.t('minutes'), '1800'=>'30 '.t('minutes'), '3600'=>'60 '.t('minutes'))),
-       '$appid' => array('appid', t('Your APPID'), $appid, t('Your API key provided by OpenWeatherMap'))
-    ));
+    $o = replace_macros ($t, [
+       '$submit' => L10n::t('Save Settings'),
+       '$cachetime' => ['cachetime', L10n::t('Caching Interval'), $cachetime, L10n::t('For how long should the weather data be cached? Choose according your OpenWeatherMap account type.'), ['0'=>L10n::t('no cache'), '300'=>'5 '.L10n::t('minutes'), '900'=>'15 '.L10n::t('minutes'), '1800'=>'30 '.L10n::t('minutes'), '3600'=>'60 '.L10n::t('minutes')]],
+       '$appid' => ['appid', L10n::t('Your APPID'), $appid, L10n::t('Your API key provided by OpenWeatherMap')]
+    ]);
 }
index 9bfb4b85ef57263973679b51103f2cf9a03fd0f4..fe0f0770cf5857bab473e694e142b1f2b848bd9f 100644 (file)
@@ -11,7 +11,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2016-09-25 17:17+0200\n"
-"PO-Revision-Date: 2016-11-22 06:43+0000\n"
+"PO-Revision-Date: 2017-09-20 06:07+0000\n"
 "Last-Translator: Tobias Diekershoff <tobias.diekershoff@gmx.net>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index a82439722bd8d429c8be7ca72192b11c005de207..e70f60907e1b1f883bd079d87fefc7005089b000 100644 (file)
@@ -27,8 +27,8 @@ CalDAV device compatibility:
   - aCal (http://andrew.mcmillan.net.nz/projects/aCal) works, available in F-Droid and Google Play
   - CalDAV-Sync (http://dmfs.org/caldav/) works, non-free
 
-Installation
-After activating, serveral tables in the database have to be created. The admin-interface of the plugin will try to do this automatically.
+## Installation
+After activating, serveral tables in the database have to be created. The admin-interface of the addon will try to do this automatically.
 In case of errors, the SQL-statement to create the tables manually are shown in the admin-interface.
 
 
@@ -61,7 +61,7 @@ MIT License
 
 
 
-Author of this plugin (the parts that are not part of the libraries above):
+Author of this addon (the parts that are not part of the libraries above):
 Tobias Hößl
 http://friendica.hoessl.eu/profile/cato
 http://www.hoessl.eu/
index 3f424d953198259b894af62f370d3e9316f5528b..aa7b686d5dcff13b4cc59ba3fc59aa73deaeab51 100644 (file)
@@ -17,7 +17,7 @@
        * Changed: The Sabre_VObject library now spawned into it's own project!
        * New feature: Support for caldav notifications!
        * Changed: Responsibility for dealing with the calendar-query is now
-         moved from the CalDAV plugin to the CalDAV backends. This allows for
+         moved from the CalDAV addon to the CalDAV backends. This allows for
          heavy optimizations.
        * Changed: The CalDAV PDO backend is now a lot faster for common
          calendar queries.
@@ -27,7 +27,7 @@
          receiving "text/x-vcard; charset=utf-8" for a contenttype.
        * Added: Sabre_DAV_Client now throws more specific exceptions in cases
          where we already has an exception class.
-       * Added: Sabre_DAV_PartialUpdate. This plugin allows you to use the
+       * Added: Sabre_DAV_PartialUpdate. This addon allows you to use the
          PATCH method to update parts of a file.
        * Added: Tons of timezone name mappings for Microsoft Exchange.
        * Added: Support for an 'exception' event.
        * Fixed: Issue 112: Stronger validation of iCalendar objects. Now making
          sure every iCalendar object only contains 1 component, and disallowing
          vcards, forcing every component to have a UID.
-       * Fixed: Basic validation for vcards in the CardDAV plugin.
+       * Fixed: Basic validation for vcards in the CardDAV addon.
        * Fixed: Issue 213: Workaround for an Evolution bug, that prevented it
          from updating events.
        * Fixed: Issue 211: A time-limit query on a non-relative alarm trigger in
          a recurring event could result in an endless loop.
        * Fixed: All uri fields are now a maximum of 200 characters. The Bynari
-         outlook plugin used much longer strings so this should improve
+         outlook addon used much longer strings so this should improve
          compatibility.
        * Fixed: Added a workaround for a bug in KDE 4.8.2 contact syncing. See
          https://bugs.kde.org/show_bug.cgi?id=300047
          COUNT= parameter in the RRULE property.
        * Added: Support for time-range filters on VALARM components.
        * Fixed: Correctly filtering all-day events.
-       * Fixed: Sending back correct mimetypes from the browser plugin (thanks
+       * Fixed: Sending back correct mimetypes from the browser addon (thanks
          Jürgen).
        * Fixed: Issue 195: Sabre_CardDAV pear package had an incorrect dependency.
        * Fixed: Calendardata would be destroyed when performing a MOVE request.
        * BC Break: Default Principals PDO backend now needs a new field in the
          'principals' table. See the website for details.
        * Added: Ability to create new calendars and addressbooks from within the
-         browser plugin.
-       * Added: Browser plugin: icons for various nodes.
+         browser addon.
+       * Added: Browser addon: icons for various nodes.
        * Added: Support for FREEBUSY reports!
        * Added: Support for creating principals with admin-level privileges.
        * Added: Possibility to let server send out invitation emails on behalf of
        * Changed: beforeCreateFile event now passes data argument by reference.
        * Changed: The 'propertyMap' property from Sabre_VObject_Reader, must now
          be specified in Sabre_VObject_Property::$classMap.
-       * Added: Ability for plugins to tell the ACL plugin which principal
-         plugins are searchable.
+       * Added: Ability for addons to tell the ACL addon which principal
+         addons are searchable.
        * Added: [DAVACL] Per-node overriding of supported privileges. This allows
          for custom privileges where needed.
-       * Added: [DAVACL] Public 'principalSearch' method on the DAVACL plugin,
+       * Added: [DAVACL] Public 'principalSearch' method on the DAVACL addon,
          which allows for easy searching for principals, based on their
          properties.
        * Added: Sabre_VObject_Component::getComponents() to return a list of only
        * Fixed: VObject properties are now always encoded before components.
        * Fixed: Sabre_DAVACL had issues with multiple levels of privilege
          aggregration.
-       * Changed: Added 'GuessContentType' plugin to fileserver.php example.
-       * Fixed: The Browser plugin will now trigger the correct events when
+       * Changed: Added 'GuessContentType' addon to fileserver.php example.
+       * Fixed: The Browser addon will now trigger the correct events when
          creating files.
        * Fixed: The ICSExportPlugin now considers ACL's.
        * Added: Made it optional to supply carddata from an Addressbook backend
          files to be locked at the same time.
 
 1.5.4-stable (2011-10-28)
-       * Fixed: GuessContentType plugin now supports mixed case file extensions.
+       * Fixed: GuessContentType addon now supports mixed case file extensions.
        * Fixed: DATE-TIME encoding was wrong in VObject. (we used 'DATETIME').
        * Changed: Sending back HTTP 204 after a PUT request on an existing resource
          instead of HTTP 200. This should fix Evolution CardDAV client
        * Fixed: Issue 140: Not returning 201 Created if an event cancelled the
          creation of a file.
        * Fixed: Issue 150: Faster URLUtil::encodePath() implementation.
-       * Fixed: Issue 144: Browser plugin could interfere with
+       * Fixed: Issue 144: Browser addon could interfere with
          TemporaryFileFilterPlugin if it was loaded first.
        * Added: It's not possible to specify more 'alternate uris' in principal
          backends.
        * Added: Clark-notation parser to XML utility.
        * Added: unset() support to VObject components.
        * Fixed: Refactored CalDAV property fetching to be faster and simpler.
-       * Added: Central string-matcher for CalDAV and CardDAV plugins.
+       * Added: Central string-matcher for CalDAV and CardDAV addons.
        * Added: i;unicode-casemap support
        * Fixed: VObject bug: wouldn't parse parameters if they weren't specified
          in uppercase.
        * Fixed: VObject bug: Parameters with no value are now correctly parsed.
        * Changed: If calendars don't specify which components they allow, 'all'
          components are assumed (e.g.: VEVENT, VTODO, VJOURNAL).
-       * Changed: Browser plugin now uses POST variable 'sabreAction' instead of
+       * Changed: Browser addon now uses POST variable 'sabreAction' instead of
          'action' to reduce the chance of collisions.
 
 1.4.4-stable (2011-07-07)
        * Added: Ability to automatically generate full .ics feeds off calendars.
          To use: Add the Sabre_CalDAV_ICSExportPlugin, and add ?export to your
          calendar url.
-       * Added: Plugins can now specify a pluginname, for easy access using
+       * Added: Plugins can now specify a addonname, for easy access using
          Sabre_DAV_Server::getPlugin().
        * Added: beforeGetProperties event.
        * Added: updateProperties event.
          break, so if you implement Sabre_DAV_ICollection directly, add the method.
        * Changed: Almost all HTTP method implementations now take a uri argument,
          including events. This allows for internal rerouting of certain calls.
-         If you have custom plugins, make sure they use this argument. If they
+         If you have custom addons, make sure they use this argument. If they
          don't, they will likely still work, but it might get in the way of
          future changes.
        * Changed: All getETag methods MUST now surround the etag with
          instead.
        * Removed: Sabre_DAV_IDirectory interface, use Sabre_DAV_ICollection
          instead.
-       * Added: Browser plugin now uses {DAV:}displayname if this property is
+       * Added: Browser addon now uses {DAV:}displayname if this property is
          available.
        * Added: Cache layer in the ObjectTree.
        * Added: Tree classes now have a delete and getChildren method.
        * Updated: Small improvements to example files.
 
 1.2.0 (2010-05-24)
-       * Fixed: Browser plugin now displays international characters.
+       * Fixed: Browser addon now displays international characters.
        * Changed: More properties in CalDAV classes are now protected instead of
          private.
 
        * Update: Complete rewrite of property updating. Now easier to use and
          atomic.
        * Fixed: Issue 16, automatically adding trailing / to baseUri.
-       * Added: text/plain is used for .txt files in GuessContentType plugin.
+       * Added: text/plain is used for .txt files in GuessContentType addon.
        * Added: support for principal-property-search and
          principal-search-property-set reports.
        * Added: Issue 31: Hiding exception information by default. Can be turned
          this.
        * Added: PDO authentication backend.
        * Added: Example sql for auth, caldav, locks for sqlite.
-       * Added: Sabre_DAV_Browser_GuessContentType plugin
-       * Changed: Authentication plugin refactored, making it possible to
+       * Added: Sabre_DAV_Browser_GuessContentType addon
+       * Changed: Authentication addon refactored, making it possible to
          implement non-digest authentication.
-       * Fixed: Better error display in browser plugin.
+       * Fixed: Better error display in browser addon.
        * Added: Support for {DAV:}supported-report-set
        * Added: XML utility class with helper functions for the WebDAV protocol.
        * Added: Tons of unittests
          Before, execution would be stopped by anything loosely evaluating to
          false.
        * Changed: the getPropertiesForPath method now takes a different set of
-         arguments, and returns a different response. This allows plugin
+         arguments, and returns a different response. This allows addon
          developers to return statuses for properties other than 200 and 404. The
          hrefs are now also always calculated relative to the baseUri, and not
          the uri of the request.
        * Changed: generatePropFindResponse is renamed to generateMultiStatus, and
          now takes a list of properties similar to the response of
          getPropertiesForPath. This was also needed to improve flexibility for
-         plugin development.
-       * Changed: Auth plugins are no longer included. They were not yet stable
+         addon development.
+       * Changed: Auth addons are no longer included. They were not yet stable
          quality, so they will probably be reintroduced in a later version.
        * Changed: PROPPATCH also used generateMultiStatus now.
        * Removed: unknownProperties event. This is replaced by the
        * Fixed: Copy and Move could fail in the root directory. This is now
          fixed.
        * Added: Plugins can now be retrieved by their classname. This is useful
-         for inter-plugin communication.
+         for inter-addon communication.
        * Added: The Auth backend can now return usernames and user-id's.
        * Added: The Auth backend got a getUsers method
        * Added: Sabre_DAV_FSExt_Directory now returns quota info
        * Fixed: UNLOCK bug. Unlock didn't work at all
 
 0.12-beta (2009-09-10)
-       * Updated: Browser plugin now shows multiple {DAV:}resourcetype values
+       * Updated: Browser addon now shows multiple {DAV:}resourcetype values
          if available.
        * Added: Experimental PDO backend for Locks Manager
        * Fixed: Sending Content-Length: 0 for every empty response. This
        * Added: Ability to choose to use auth-int, auth or both for HTTP Digest
          authentication. (Issue 11)
        * Changed: Made more methods in Sabre_DAV_Server public.
-       * Fixed: TemporaryFileFilter plugin now intercepts HTTP LOCK requests
+       * Fixed: TemporaryFileFilter addon now intercepts HTTP LOCK requests
          to non-existent files. (Issue 12)
        * Added: Central list of defined xml namespace prefixes. This can reduce
          Bandwidth and legibility for xml bodies with user-defined namespaces.
          and IDirectory objects. If you created your own Tree objects,
          this will most likely break in this release.
        * Changed: Moved all the Locking logic from the Tree and Server classes
-         into a separate plugin.
-       * Changed: TemporaryFileFilter is now a plugin.
+         into a separate addon.
+       * Changed: TemporaryFileFilter is now a addon.
        * Added: Comes with an autoloader script. This can be used instead of
          the includer script, and is preferred by some people.
        * Added: AWS Authentication class.
          priority. This is for example needed to ensure that the Authentication
          Plugin is used before any other Plugin.
        * Added: 22 new tests.
-       * Added: Users-manager plugin for .htdigest files. Experimental and
+       * Added: Users-manager addon for .htdigest files. Experimental and
          subject to change.
        * Added: RFC 2324 HTTP 418 status code
        * Fixed: Exclusive locks could in some cases be picked up as shared locks
        * Changed: Renamed all exceptions! This is a compatibility break. Every
          Exception now follows Sabre_DAV_Exception_FileNotFound convention
          instead of Sabre_DAV_FileNotFoundException.
-       * Added: Browser plugin now allows uploading and creating directories
+       * Added: Browser addon now allows uploading and creating directories
          straight from the browser.
        * Added: 12 more unittests
        * Fixed: Locking bug, which became prevalent on Windows Vista.
        * Added: support for {DAV:}supportedlock.
        * Added: support for {DAV:}lockdiscovery.
        * Added: 6 new tests.
-       * Added: New plugin system.
-       * Added: Simple HTML directory plugin, for browser access.
+       * Added: New addon system.
+       * Added: Simple HTML directory addon, for browser access.
        * Added: Server class now sends back standard pre-condition error xml
        bodies. This was new since RFC4918.
        * Added: Sabre_DAV_Tree_Aggregrate, which can 'host' multiple Tree objects
        into one.
        * Added: simple basis for HTTP REPORT method. This method is not used yet,
-       but can be used by plugins to add reports.
+       but can be used by addons to add reports.
        * Changed: ->getSize is only called for files, no longer for collections.
        r303
        * Changed: Sabre_DAV_FilterTree is now Sabre_DAV_Tree_Filter
index d3e4e7b7201c27613bd333065e3da1bd5c59d247..7d989a951dc684a0831136d8e59cde86d0aff1c6 100644 (file)
@@ -5,7 +5,7 @@ use Sabre\VObject;
 /**
  * ICS Exporter
  *
- * This plugin adds the ability to export entire calendars as .ics files.
+ * This addon adds the ability to export entire calendars as .ics files.
  * This is useful for clients that don't support CalDAV yet. They often do
  * support ics files.
  *
@@ -25,7 +25,7 @@ class Sabre_CalDAV_ICSExportPlugin extends Sabre_DAV_ServerPlugin {
     private $server;
 
     /**
-     * Initializes the plugin and registers event handlers
+     * Initializes the addon and registers event handlers
      *
      * @param Sabre_DAV_Server $server
      * @return void
index 8f6cb260100371a808c69aaf3c1c83a00ff9a8d9..479720c6bd7479c495827728b67002aaa7d9957b 100644 (file)
@@ -4,7 +4,7 @@
  * This node represents a list of notifications.
  *
  * It provides no additional functionality, but you must implement this
- * interface to allow the Notifications plugin to mark the collection
+ * interface to allow the Notifications addon to mark the collection
  * as a notifications collection.
  *
  * This collection should only return Sabre_CalDAV_Notifications_INode nodes as
index eb873af3f92aecd9d5e68870218a9b813e03e5ad..bdf6bf1ece9dcce2eae2efab457ddcc548947eae 100644 (file)
@@ -4,7 +4,7 @@
  * This node represents a list of notifications.
  *
  * It provides no additional functionality, but you must implement this
- * interface to allow the Notifications plugin to mark the collection
+ * interface to allow the Notifications addon to mark the collection
  * as a notifications collection.
  *
  * This collection should only return Sabre_CalDAV_Notifications_INode nodes as
index c0e4a206de7ef36a22016c960a210a6a65b18505..f1c93af081581bb1f5fce6764b4f6a5a47eee67e 100644 (file)
@@ -3,9 +3,9 @@
 use Sabre\VObject;
 
 /**
- * CalDAV plugin
+ * CalDAV addon
  *
- * This plugin provides functionality added by CalDAV (RFC 4791)
+ * This addon provides functionality added by CalDAV (RFC 4791)
  * It implements new reports, and the MKCALENDAR method.
  *
  * @package Sabre
@@ -67,7 +67,7 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Use this method to tell the server this plugin defines additional
+     * Use this method to tell the server this addon defines additional
      * HTTP methods.
      *
      * This method is passed a uri. It should only return HTTP methods that are
@@ -107,9 +107,9 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Returns a plugin name.
+     * Returns a addon name.
      *
-     * Using this name other plugins will be able to access other plugins
+     * Using this name other addons will be able to access other addons
      * using Sabre_DAV_Server::getPlugin
      *
      * @return string
@@ -121,7 +121,7 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Returns a list of reports this plugin supports.
+     * Returns a list of reports this addon supports.
      *
      * This will be used in the {DAV:}supported-report-set property.
      * Note that you still need to subscribe to the 'report' event to actually
@@ -147,7 +147,7 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Initializes the plugin
+     * Initializes the addon
      *
      * @param Sabre_DAV_Server $server
      * @return void
@@ -631,7 +631,7 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin {
         $acl = $this->server->getPlugin('acl');
 
         if (!$acl) {
-            throw new Sabre_DAV_Exception('The ACL plugin must be loaded for free-busy queries to work');
+            throw new Sabre_DAV_Exception('The ACL addon must be loaded for free-busy queries to work');
         }
         $uri = $this->server->getRequestUri();
         $acl->checkPrivileges($uri,'{' . self::NS_CALDAV . '}read-free-busy');
@@ -665,7 +665,7 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin {
     /**
      * This method is triggered before a file gets updated with new content.
      *
-     * This plugin uses this method to ensure that CalDAV objects receive
+     * This addon uses this method to ensure that CalDAV objects receive
      * valid calendar data.
      *
      * @param string $path
@@ -685,7 +685,7 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin {
     /**
      * This method is triggered before a new file is created.
      *
-     * This plugin uses this method to ensure that newly created calendar
+     * This addon uses this method to ensure that newly created calendar
      * objects contain valid calendar data.
      *
      * @param string $path
@@ -1014,7 +1014,7 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin {
 
     /**
      * This method allows us to intercept the 'mkcalendar' sabreAction. This
-     * action enables the user to create new calendars from the browser plugin.
+     * action enables the user to create new calendars from the browser addon.
      *
      * @param string $uri
      * @param string $action
index 09aa07d7f44c83face83cf02c738606cdda870f9..639f5d0ddbc20ca8c50a9c1d1f70d77300662806 100644 (file)
@@ -5,7 +5,7 @@
  *
  * The outbox is mainly used as an endpoint in the tree for a client to do
  * free-busy requests. This functionality is completely handled by the
- * Scheduling plugin, so this object is actually mostly static.
+ * Scheduling addon, so this object is actually mostly static.
  *
  * @package Sabre
  * @subpackage CalDAV
index 30194bb6469f9c85c3164e04b69267d42cf7de42..aa6a523d3ce7c49f8d23e6fdf335595e81e48cfb 100644 (file)
@@ -3,9 +3,9 @@
 use Sabre\VObject;
 
 /**
- * CardDAV plugin
+ * CardDAV addon
  *
- * The CardDAV plugin adds CardDAV functionality to the WebDAV server
+ * The CardDAV addon adds CardDAV functionality to the WebDAV server
  *
  * @package Sabre
  * @subpackage CardDAV
@@ -41,7 +41,7 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin {
     protected $server;
 
     /**
-     * Initializes the plugin
+     * Initializes the addon
      *
      * @param Sabre_DAV_Server $server
      * @return void
@@ -91,7 +91,7 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Returns a list of reports this plugin supports.
+     * Returns a list of reports this addon supports.
      *
      * This will be used in the {DAV:}supported-report-set property.
      * Note that you still need to subscribe to the 'report' event to actually
@@ -290,7 +290,7 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin {
     /**
      * This method is triggered before a file gets updated with new content.
      *
-     * This plugin uses this method to ensure that Card nodes receive valid
+     * This addon uses this method to ensure that Card nodes receive valid
      * vcard data.
      *
      * @param string $path
@@ -310,7 +310,7 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin {
     /**
      * This method is triggered before a new file is created.
      *
-     * This plugin uses this method to ensure that Card nodes receive valid
+     * This addon uses this method to ensure that Card nodes receive valid
      * vcard data.
      *
      * @param string $path
@@ -671,7 +671,7 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin {
 
     /**
      * This method allows us to intercept the 'mkcalendar' sabreAction. This
-     * action enables the user to create new calendars from the browser plugin.
+     * action enables the user to create new calendars from the browser addon.
      *
      * @param string $uri
      * @param string $action
index 55a4e3916741c9a7d728a2c54ae0d5ba4f127eba..256e0c02a04e0bc40fc1223e965e33dbffa26534 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * This plugin provides Authentication for a WebDAV server.
+ * This addon provides Authentication for a WebDAV server.
  *
  * It relies on a Backend object, which provides user information.
  *
@@ -52,7 +52,7 @@ class Sabre_DAV_Auth_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Initializes the plugin. This function is automatically called by the server
+     * Initializes the addon. This function is automatically called by the server
      *
      * @param Sabre_DAV_Server $server
      * @return void
@@ -65,9 +65,9 @@ class Sabre_DAV_Auth_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Returns a plugin name.
+     * Returns a addon name.
      *
-     * Using this name other plugins will be able to access other plugins
+     * Using this name other addons will be able to access other addons
      * using Sabre_DAV_Server::getPlugin
      *
      * @return string
index b6c00d461cb95e3ac778d5810b94a439b26d99c9..add059b282185204924d337a76777c66dc3c828d 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * GuessContentType plugin
+ * GuessContentType addon
  *
  * A lot of the built-in File objects just return application/octet-stream
  * as a content-type by default. This is a problem for some clients, because
@@ -43,7 +43,7 @@ class Sabre_DAV_Browser_GuessContentType extends Sabre_DAV_ServerPlugin {
     );
 
     /**
-     * Initializes the plugin
+     * Initializes the addon
      *
      * @param Sabre_DAV_Server $server
      * @return void
index 1588488764133f951cf103fad141763de653154e..01c40749ed72f9bc62d0e25ab9c24c399193f57e 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * This is a simple plugin that will map any GET request for non-files to
+ * This is a simple addon that will map any GET request for non-files to
  * PROPFIND allprops-requests.
  *
  * This should allow easy debugging of PROPFIND
@@ -22,7 +22,7 @@ class Sabre_DAV_Browser_MapGetToPropFind extends Sabre_DAV_ServerPlugin {
     protected $server;
 
     /**
-     * Initializes the plugin and subscribes to events
+     * Initializes the addon and subscribes to events
      *
      * @param Sabre_DAV_Server $server
      * @return void
index 09bbdd2ae021e013c83c85bcbbc77f9cfb8a6ace..df6867e319781c9023ca10e1aa384b602e680477 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * Browser Plugin
  *
- * This plugin provides a html representation, so that a WebDAV server may be accessed
+ * This addon provides a html representation, so that a WebDAV server may be accessed
  * using a browser.
  *
  * The class intercepts GET requests to collection resources and generates a simple
@@ -60,7 +60,7 @@ class Sabre_DAV_Browser_Plugin extends Sabre_DAV_ServerPlugin {
     protected $enablePost = true;
 
     /**
-     * By default the browser plugin will generate a favicon and other images.
+     * By default the browser addon will generate a favicon and other images.
      * To turn this off, set this property to false.
      *
      * @var bool
@@ -84,7 +84,7 @@ class Sabre_DAV_Browser_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Initializes the plugin and subscribes to events
+     * Initializes the addon and subscribes to events
      *
      * @param Sabre_DAV_Server $server
      * @return void
@@ -122,7 +122,7 @@ class Sabre_DAV_Browser_Plugin extends Sabre_DAV_ServerPlugin {
             $node = $this->server->tree->getNodeForPath($uri);
         } catch (Sabre_DAV_Exception_NotFound $e) {
             // We're simply stopping when the file isn't found to not interfere
-            // with other plugins.
+            // with other addons.
             return;
         }
         if ($node instanceof Sabre_DAV_IFile)
index 957ac506a9c1bb9baf96e2689fae69ea17ca50b1..3e5c71bcf44ce15d89ab1762e3307f40490026d7 100644 (file)
@@ -1,9 +1,9 @@
 <?php
 
 /**
- * Locking plugin
+ * Locking addon
  *
- * This plugin provides locking support to a WebDAV server.
+ * This addon provides locking support to a WebDAV server.
  * The easiest way to get started, is by hooking it up as such:
  *
  * $lockBackend = new Sabre_DAV_Locks_Backend_File('./mylockdb');
@@ -44,7 +44,7 @@ class Sabre_DAV_Locks_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Initializes the plugin
+     * Initializes the addon
      *
      * This method is automatically called by the Server class after addPlugin.
      *
@@ -61,9 +61,9 @@ class Sabre_DAV_Locks_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Returns a plugin name.
+     * Returns a addon name.
      *
-     * Using this name other plugins will be able to access other plugins
+     * Using this name other addons will be able to access other addons
      * using Sabre_DAV_Server::getPlugin
      *
      * @return string
@@ -78,7 +78,7 @@ class Sabre_DAV_Locks_Plugin extends Sabre_DAV_ServerPlugin {
      * This method is called by the Server if the user used an HTTP method
      * the server didn't recognize.
      *
-     * This plugin intercepts the LOCK and UNLOCK methods.
+     * This addon intercepts the LOCK and UNLOCK methods.
      *
      * @param string $method
      * @param string $uri
@@ -134,7 +134,7 @@ class Sabre_DAV_Locks_Plugin extends Sabre_DAV_ServerPlugin {
      * This method is called before the logic for any HTTP method is
      * handled.
      *
-     * This plugin uses that feature to intercept access to locked resources.
+     * This addon uses that feature to intercept access to locked resources.
      *
      * @param string $method
      * @param string $uri
@@ -179,7 +179,7 @@ class Sabre_DAV_Locks_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Use this method to tell the server this plugin defines additional
+     * Use this method to tell the server this addon defines additional
      * HTTP methods.
      *
      * This method is passed a uri. It should only return HTTP methods that are
index b37a90ae9939a1315e438a4bd55d5687e12cc28b..45f865bd81695f916b38ac29faed17ba08c23e74 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * This plugin provides support for RFC4709: Mounting WebDAV servers
+ * This addon provides support for RFC4709: Mounting WebDAV servers
  *
  * Simply append ?mount to any collection to generate the davmount response.
  *
@@ -20,7 +20,7 @@ class Sabre_DAV_Mount_Plugin extends Sabre_DAV_ServerPlugin {
     private $server;
 
     /**
-     * Initializes the plugin and registers event handles
+     * Initializes the addon and registers event handles
      *
      * @param Sabre_DAV_Server $server
      * @return void
index 170acbc9785132db3098179d5ed3241c0b60c4ad..2293359789bfba96cd8f105e5d0a2ab556c22d0d 100644 (file)
@@ -1,8 +1,8 @@
 <?php
 /**
- * Partial update plugin (Patch method)
+ * Partial update addon (Patch method)
  *
- * This plugin provides a way to modify only part of a target resource
+ * This addon provides a way to modify only part of a target resource
  * It may bu used to update a file chunk, upload big a file into smaller
  * chunks or resume an upload.
  *
@@ -25,7 +25,7 @@ class Sabre_DAV_PartialUpdate_Plugin extends Sabre_DAV_ServerPlugin {
     protected $server;
 
     /**
-     * Initializes the plugin
+     * Initializes the addon
      *
      * This method is automatically called by the Server class after addPlugin.
      *
@@ -40,9 +40,9 @@ class Sabre_DAV_PartialUpdate_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Returns a plugin name.
+     * Returns a addon name.
      *
-     * Using this name other plugins will be able to access other plugins
+     * Using this name other addons will be able to access other addons
      * using Sabre_DAV_Server::getPlugin
      *
      * @return string
@@ -57,7 +57,7 @@ class Sabre_DAV_PartialUpdate_Plugin extends Sabre_DAV_ServerPlugin {
      * This method is called by the Server if the user used an HTTP method
      * the server didn't recognize.
      *
-     * This plugin intercepts the PATCH methods.
+     * This addon intercepts the PATCH methods.
      *
      * @param string $method
      * @param string $uri
@@ -75,7 +75,7 @@ class Sabre_DAV_PartialUpdate_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Use this method to tell the server this plugin defines additional
+     * Use this method to tell the server this addon defines additional
      * HTTP methods.
      *
      * This method is passed a uri. It should only return HTTP methods that are
index aa586ae3536cfec81ed811b3b6029e251ad54d77..5d04b67502e12f99a6d6c1649b416c53d5358135 100644 (file)
@@ -60,7 +60,7 @@ class Sabre_DAV_Server {
     public $httpRequest;
 
     /**
-     * The list of plugins
+     * The list of addons
      *
      * @var array
      */
@@ -324,7 +324,7 @@ class Sabre_DAV_Server {
     }
 
     /**
-     * Adds a plugin to the server
+     * Adds a addon to the server
      *
      * For more information, console the documentation of Sabre_DAV_ServerPlugin
      *
@@ -339,9 +339,9 @@ class Sabre_DAV_Server {
     }
 
     /**
-     * Returns an initialized plugin by it's name.
+     * Returns an initialized addon by it's name.
      *
-     * This function returns null if the plugin was not found.
+     * This function returns null if the addon was not found.
      *
      * @param string $name
      * @return Sabre_DAV_ServerPlugin
@@ -361,7 +361,7 @@ class Sabre_DAV_Server {
     }
 
     /**
-     * Returns all plugins
+     * Returns all addons
      *
      * @return array
      */
@@ -379,7 +379,7 @@ class Sabre_DAV_Server {
      * It is possible to control the order of the callbacks through the
      * priority argument.
      *
-     * This is for example used to make sure that the authentication plugin
+     * This is for example used to make sure that the authentication addon
      * is triggered before anything else. If it's not needed to change this
      * number, it is recommended to ommit.
      *
@@ -1050,7 +1050,7 @@ class Sabre_DAV_Server {
             $methods[] = 'MKCOL';
         }
 
-        // We're also checking if any of the plugins register any new methods
+        // We're also checking if any of the addons register any new methods
         foreach($this->plugins as $plugin) $methods = array_merge($methods, $plugin->getHTTPMethods($uri));
         array_unique($methods);
 
@@ -1464,7 +1464,7 @@ class Sabre_DAV_Server {
      *
      * Currently this is done by HTTP PUT and HTTP LOCK (in the Locks_Plugin).
      * It was important to get this done through a centralized function,
-     * allowing plugins to intercept this using the beforeCreateFile event.
+     * allowing addons to intercept this using the beforeCreateFile event.
      *
      * This method will return true if the file was actually created
      *
@@ -1654,7 +1654,7 @@ class Sabre_DAV_Server {
         }
 
         if (!$hasError) {
-            // Allowing plugins to take care of property updating
+            // Allowing addons to take care of property updating
             $hasError = !$this->broadcastEvent('updateProperties',array(
                 &$remainingProperties,
                 &$result,
index 131863d13fbf3a9823282d0b9aebb5b7c4e9a760..4dcee58794a4707f8b5921ccaa53f82b4f40171d 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * The baseclass for all server plugins.
+ * The baseclass for all server addons.
  *
  * Plugins can modify or extend the servers behaviour.
  *
@@ -14,7 +14,7 @@
 abstract class Sabre_DAV_ServerPlugin {
 
     /**
-     * This initializes the plugin.
+     * This initializes the addon.
      *
      * This function is called by Sabre_DAV_Server, after
      * addPlugin is called.
@@ -41,7 +41,7 @@ abstract class Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Use this method to tell the server this plugin defines additional
+     * Use this method to tell the server this addon defines additional
      * HTTP methods.
      *
      * This method is passed a uri. It should only return HTTP methods that are
@@ -57,9 +57,9 @@ abstract class Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Returns a plugin name.
+     * Returns a addon name.
      *
-     * Using this name other plugins will be able to access other plugins
+     * Using this name other addons will be able to access other addons
      * using Sabre_DAV_Server::getPlugin
      *
      * @return string
@@ -71,7 +71,7 @@ abstract class Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Returns a list of reports this plugin supports.
+     * Returns a list of reports this addon supports.
      *
      * This will be used in the {DAV:}supported-report-set property.
      * Note that you still need to subscribe to the 'report' event to actually
index 36096e677752e61fc1b62e53f3caf64c47e131aa..843112081ccd88a22d1476bbac15ee0f7cb35433 100644 (file)
@@ -45,7 +45,7 @@ class Sabre_DAV_TemporaryFileFilterPlugin extends Sabre_DAV_ServerPlugin {
     );
 
     /**
-     * This is the directory where this plugin
+     * This is the directory where this addon
      * will store it's files.
      *
      * @var string
@@ -60,7 +60,7 @@ class Sabre_DAV_TemporaryFileFilterPlugin extends Sabre_DAV_ServerPlugin {
     private $server;
 
     /**
-     * Creates the plugin.
+     * Creates the addon.
      *
      * Make sure you specify a directory for your files. If you don't, we
      * will use PHP's directory for session-storage instead, and you might
@@ -77,9 +77,9 @@ class Sabre_DAV_TemporaryFileFilterPlugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Initialize the plugin
+     * Initialize the addon
      *
-     * This is called automatically be the Server class after this plugin is
+     * This is called automatically be the Server class after this addon is
      * added with Sabre_DAV_Server::addPlugin()
      *
      * @param Sabre_DAV_Server $server
index 1dd00c87581e301dbdde6b70905b07f40530d138..cb3c44c17c0202165ba21d406acd7e95ade58dfb 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * SabreDAV ACL Plugin
  *
- * This plugin provides functionality to enforce ACL permissions.
+ * This addon provides functionality to enforce ACL permissions.
  * ACL is defined in RFC3744.
  *
  * In addition it also provides support for the {DAV:}current-user-principal
@@ -81,7 +81,7 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin {
 
     /**
      * This string is prepended to the username of the currently logged in
-     * user. This allows the plugin to determine the principal path based on
+     * user. This allows the addon to determine the principal path based on
      * the username.
      *
      * @var string
@@ -111,7 +111,7 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin {
     public $adminPrincipals = array();
 
     /**
-     * Returns a list of features added by this plugin.
+     * Returns a list of features added by this addon.
      *
      * This list is used in the response of a HTTP OPTIONS request.
      *
@@ -136,9 +136,9 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Returns a plugin name.
+     * Returns a addon name.
      *
-     * Using this name other plugins will be able to access other plugins
+     * Using this name other addons will be able to access other addons
      * using Sabre_DAV_Server::getPlugin
      *
      * @return string
@@ -150,7 +150,7 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Returns a list of reports this plugin supports.
+     * Returns a list of reports this addon supports.
      *
      * This will be used in the {DAV:}supported-report-set property.
      * Note that you still need to subscribe to the 'report' event to actually
@@ -283,7 +283,7 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Returns the supported privilege structure for this ACL plugin.
+     * Returns the supported privilege structure for this ACL addon.
      *
      * See RFC3744 for more details. Currently we default on a simple,
      * standard structure.
@@ -608,7 +608,7 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin {
     }
 
     /**
-     * Sets up the plugin
+     * Sets up the addon
      *
      * This method is automatically called by the server class.
      *
@@ -1067,7 +1067,7 @@ class Sabre_DAVACL_Plugin extends Sabre_DAV_ServerPlugin {
      * there.
      *
      * Other rfc's, such as ACL rely on this report, so it made sense to put
-     * it in this plugin.
+     * it in this addon.
      *
      * @param DOMElement $dom
      * @return void
index a76b4a9d7279dcaf47e7286eb718c237b6ca4d5a..6495a1bd4dcc72c48d362c56ce1ceeb756a42056 100644 (file)
@@ -53,7 +53,7 @@ class Sabre_DAVACL_PrincipalBackend_PDO implements Sabre_DAVACL_IPrincipalBacken
         ),
 
         /**
-         * This property is actually used by the CardDAV plugin, where it gets
+         * This property is actually used by the CardDAV addon, where it gets
          * mapped to {http://calendarserver.orgi/ns/}me-card.
          *
          * The reason we don't straight-up use that property, is because
index b41ee438a1721bda074a675eb38e6f8cd5fc59fd..3e77f1dcd220b15d1dd216439295c109a75c4b7d 100644 (file)
@@ -9,7 +9,7 @@ For more details check the introductory blog post - http://laktek.com/2008/10/27
 You can either clone [this repo](https://github.com/laktek/really-simple-color-picker) or download the latest build as a zip from here - http://github.com/laktek/really-simple-color-picker/zipball/master
 
 Color Picker requires jQuery 1.2.6 or higher. Make sure to load it before Color Picker (there's no other dependencies!). 
-For default styles of the color picker load the CSS file that comes with the plugin.
+For default styles of the color picker load the CSS file that comes with the addon.
 
   ```html
     <script language="javascript" type="text/javascript" src=jquery.min.js"></script>
index 11f31f7de4e7f3792dec1def9348e12678a89319..ef1a9b0ccdb61bbaca2c1ca2070e51bd0acc2ebe 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use Friendica\Util\DateTimeFormat;
 
 define("DAV_ACL_READ", "{DAV:}read");
 define("DAV_ACL_WRITE", "{DAV:}write");
@@ -150,7 +151,7 @@ function vcard_source_compile($vcardsource)
  */
 function wdcal_php2MySqlTime($phpDate)
 {
-       return date("Y-m-d H:i:s", $phpDate);
+       return date(DateTimeFormat::MYSQL, $phpDate);
 }
 
 /**
@@ -159,7 +160,7 @@ function wdcal_php2MySqlTime($phpDate)
  */
 function wdcal_mySql2PhpTime($sqlDate)
 {
-       $ts = DateTime::createFromFormat("Y-m-d H:i:s", $sqlDate);
+       $ts = DateTime::createFromFormat(DateTimeFormat::MYSQL, $sqlDate);
        return $ts->format("U");
 }
 
index d80892f7ccac8d630a3c506945c2e3cddbe960f6..bc13ce39fe7250b6e2cc68932cf57d68ed1e5745 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use Friendica\Util\DateTimeFormat;
 
 
 /**
@@ -109,15 +110,15 @@ function renderCalDavEntry_data(&$calendar, &$calendarobject)
 
                q("INSERT INTO %s%sjqcalendar (`calendar_id`, `calendarobject_id`, `Summary`, `StartTime`, `EndTime`, `IsEditable`, `IsAllDayEvent`, `IsRecurring`, `Color`) VALUES
                        (%d, %d, '%s', CONVERT_TZ('%s', '$timezoneOffset', @@session.time_zone), CONVERT_TZ('%s', '$timezoneOffset', @@session.time_zone), %d, %d, %d, '%s')",
-                       CALDAV_SQL_DB, CALDAV_SQL_PREFIX, IntVal($calendar["id"]), IntVal($calendarobject["id"]), dbesc($event["summary"]), date("Y-m-d H:i:s", $start),
-                       date("Y-m-d H:i:s", $last_end), 1, $allday, $recurring, dbesc(substr($event["color"], 1))
+                       CALDAV_SQL_DB, CALDAV_SQL_PREFIX, IntVal($calendar["id"]), IntVal($calendarobject["id"]), dbesc($event["summary"]), date(DateTimeFormat::MYSQL, $start),
+                       date(DateTimeFormat::MYSQL, $last_end), 1, $allday, $recurring, dbesc(substr($event["color"], 1))
                );
 
                foreach ($alarms as $alarm) {
                        $alarm    = renderCalDavEntry_calcalarm($alarm, $component);
                        $notified = ($alarm->getTimestamp() < time() ? 1 : 0);
                        q("INSERT INTO %s%snotifications (`calendar_id`, `calendarobject_id`, `alert_date`, `notified`) VALUES (%d, %d, CONVERT_TZ('%s', '$timezoneOffset', @@session.time_zone), %d)",
-                               CALDAV_SQL_DB, CALDAV_SQL_PREFIX, IntVal($calendar["id"]), IntVal($calendarobject["id"]), $alarm->format("Y-m-d H:i:s"), $notified
+                               CALDAV_SQL_DB, CALDAV_SQL_PREFIX, IntVal($calendar["id"]), IntVal($calendarobject["id"]), $alarm->format(DateTimeFormat::MYSQL), $notified
                        );
                }
 
index 1eb3b3656c7b76684afa9972209722dc09af9f63..24f79034727deb9f3cdf7d0420772522b0097d31 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Friendica\Core\L10n;
+
 class Sabre_CalDAV_Backend_Private extends Sabre_CalDAV_Backend_Common
 {
 
@@ -36,7 +38,7 @@ class Sabre_CalDAV_Backend_Private extends Sabre_CalDAV_Backend_Common
         */
        public static function getBackendTypeName()
        {
-               return t("Private Events");
+               return L10n::t("Private Events");
        }
 
        /**
index 71923b998856cebdc4da7513a11d3a05a54b726d..47bfc1ab7ffab573c0e35d3dee4ab960564bc7ae 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Friendica\Core\L10n;
+
 class Sabre_CardDAV_Backend_Std extends Sabre_CardDAV_Backend_Common
 {
 
@@ -43,7 +45,7 @@ class Sabre_CardDAV_Backend_Std extends Sabre_CardDAV_Backend_Common
         */
        public static function getBackendTypeName()
        {
-               return t("Private Addressbooks");
+               return L10n::t("Private Addressbooks");
        }
 
        /**
index 201917c0e151f9c1f8f146fb5438d14ba2416bfc..c8221a696ada2c602ae48b3cfd1fd26572d5efe5 100644 (file)
 \r
 \r
        if ($.fn.noSelect == undefined) {\r
-               $.fn.noSelect = function (p) { //no select plugin by me :-)\r
+               $.fn.noSelect = function (p) { //no select addon by me :-)\r
                        var prevent;\r
                        if (p == null)\r
                                prevent = true;\r
index 330f29889232e08152663be802e31b3b50cb5cc1..d66251f4e78c00762eced0718a83cb6e2d66359d 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
-
-
+use Friendica\Core\L10n;
+use Friendica\Util\DateTimeFormat;
 
 /**
  * @param mixed $obj
@@ -89,7 +89,7 @@ function wdcal_print_feed($base_path = "")
                        $cs = wdcal_print_feed_getCal($server, DAV_ACL_WRITE);
                        if ($cs == null) {
                                echo wdcal_jsonp_encode(array('IsSuccess' => false,
-                                                                                         'Msg'       => t('No access')));
+                                                                                         'Msg'       => L10n::t('No access')));
                                killme();
                        }
                        try {
@@ -101,9 +101,9 @@ function wdcal_print_feed($base_path = "")
                                else $type = Sabre\VObject\Property\DateTime::LOCALTZ;
 
                                $datetime_start = new Sabre\VObject\Property\DateTime("DTSTART");
-                               $datetime_start->setDateTime(new DateTime(date("Y-m-d H:i:s", IntVal($_REQUEST["CalendarStartTime"]))), $type);
+                               $datetime_start->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, IntVal($_REQUEST["CalendarStartTime"]))), $type);
                                $datetime_end = new Sabre\VObject\Property\DateTime("DTEND");
-                               $datetime_end->setDateTime(new DateTime(date("Y-m-d H:i:s", IntVal($_REQUEST["CalendarEndTime"]))), $type);
+                               $datetime_end->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, IntVal($_REQUEST["CalendarEndTime"]))), $type);
 
                                $component->add($datetime_start);
                                $component->add($datetime_end);
@@ -163,7 +163,7 @@ function wdcal_print_feed($base_path = "")
                        $r = q("SELECT `calendarobject_id`, `calendar_id` FROM %s%sjqcalendar WHERE `id`=%d", CALDAV_SQL_DB, CALDAV_SQL_PREFIX, IntVal($_REQUEST["jq_id"]));
                        if (count($r) != 1) {
                                echo wdcal_jsonp_encode(array('IsSuccess' => false,
-                                                                                         'Msg'       => t('No access')));
+                                                                                         'Msg'       => L10n::t('No access')));
                                killme();
                        }
                        try {
@@ -175,7 +175,7 @@ function wdcal_print_feed($base_path = "")
 
                                if (!$component) {
                                        echo wdcal_jsonp_encode(array('IsSuccess' => false,
-                                                                                                 'Msg'       => t('No access')));
+                                                                                                 'Msg'       => L10n::t('No access')));
                                        killme();
                                }
 
@@ -183,9 +183,9 @@ function wdcal_print_feed($base_path = "")
                                else $type = Sabre\VObject\Property\DateTime::LOCALTZ;
 
                                $datetime_start = new Sabre\VObject\Property\DateTime("DTSTART");
-                               $datetime_start->setDateTime(new DateTime(date("Y-m-d H:i:s", IntVal($_REQUEST["CalendarStartTime"]))), $type);
+                               $datetime_start->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, IntVal($_REQUEST["CalendarStartTime"]))), $type);
                                $datetime_end = new Sabre\VObject\Property\DateTime("DTEND");
-                               $datetime_end->setDateTime(new DateTime(date("Y-m-d H:i:s", IntVal($_REQUEST["CalendarEndTime"]))), $type);
+                               $datetime_end->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, IntVal($_REQUEST["CalendarEndTime"]))), $type);
 
                                $component->__unset("DTSTART");
                                $component->__unset("DTEND");
@@ -203,7 +203,7 @@ function wdcal_print_feed($base_path = "")
                                );
                        } catch (Exception $e) {
                                echo wdcal_jsonp_encode(array('IsSuccess' => false,
-                                                                                         'Msg'       => t('No access')));
+                                                                                         'Msg'       => L10n::t('No access')));
                                killme();
                        }
                        break;
@@ -211,7 +211,7 @@ function wdcal_print_feed($base_path = "")
                        $r = q("SELECT `calendarobject_id`, `calendar_id` FROM %s%sjqcalendar WHERE `id`=%d", CALDAV_SQL_DB, CALDAV_SQL_PREFIX, IntVal($_REQUEST["jq_id"]));
                        if (count($r) != 1) {
                                echo wdcal_jsonp_encode(array('IsSuccess' => false,
-                                                                                         'Msg'       => t('No access')));
+                                                                                         'Msg'       => L10n::t('No access')));
                                killme();
                        }
                        try {
@@ -226,7 +226,7 @@ function wdcal_print_feed($base_path = "")
                                );
                        } catch (Exception $e) {
                                echo wdcal_jsonp_encode(array('IsSuccess' => false,
-                                                                                         'Msg'       => t('No access')));
+                                                                                         'Msg'       => L10n::t('No access')));
                                killme();
                        }
 
index c7b66fb1187c2f4a0d67ccf6b7a36cd9073e9edc..001d4528e9cd9b529b4b21f2cdf783aa0d313cb0 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+
 abstract class wdcal_local
 {
 
@@ -145,7 +148,7 @@ class wdcal_local_us extends wdcal_local {
         * @return string
         */
        static function getName() {
-               return t("U.S. Time Format (mm/dd/YYYY)");
+               return L10n::t("U.S. Time Format (mm/dd/YYYY)");
        }
 
        /**
@@ -240,7 +243,7 @@ class wdcal_local_de extends  wdcal_local {
         * @return string
         */
        static function getName() {
-               return t("German Time Format (dd.mm.YYYY)");
+               return L10n::t("German Time Format (dd.mm.YYYY)");
        }
 
        /**
index d507a900087b4b50ad9c97014eedcd409b1041b5..49cc152336979c85cab31ab12809c99d89502438 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+use Friendica\Core\L10n;
+use Friendica\Util\DateTimeFormat;
+
 /**
  * @param wdcal_local $localization
  * @param string $baseurl
@@ -27,7 +30,7 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $calendar_id, $uri)
                $vObject   = dav_get_current_user_calendarobject($server, $calendar, $obj_uri["uri"], DAV_ACL_WRITE);
                $component = dav_get_eventComponent($vObject);
 
-               if ($component == null) return t('Could not open component for editing');
+               if ($component == null) return L10n::t('Could not open component for editing');
 
                /** @var Sabre\VObject\Property\DateTime $dtstart  */
                $dtstart = $component->__get("DTSTART");
@@ -137,13 +140,13 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $calendar_id, $uri)
 
        $postto = $baseurl . "/dav/wdcal/" . ($uri == 0 ? "new/" : $calendar_id . "/" . $uri . "/edit/");
 
-       $out = "<a href='" . $baseurl . "/dav/wdcal/'>" . t("Go back to the calendar") . "</a><br><br>";
+       $out = "<a href='" . $baseurl . "/dav/wdcal/'>" . L10n::t("Go back to the calendar") . "</a><br><br>";
        $out .= "<form method='POST' action='$postto'>
                <input type='hidden' name='form_security_token' value='" . get_form_security_token('caledit') . "'>\n";
 
-       $out .= "<h2>" . t("Event data") . "</h2>";
+       $out .= "<h2>" . L10n::t("Event data") . "</h2>";
 
-       $out .= "<label for='calendar' class='block'>" . t("Calendar") . ":</label><select id='calendar' name='calendar' size='1'>";
+       $out .= "<label for='calendar' class='block'>" . L10n::t("Calendar") . ":</label><select id='calendar' name='calendar' size='1'>";
        $found   = false;
        $cal_col = "aaaaaa";
        foreach ($calendars as $cal) {
@@ -160,47 +163,47 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $calendar_id, $uri)
        $out .= "</select>";
        $out .= "&nbsp; &nbsp; <label class='plain'><input type='checkbox' name='color_override' id='color_override' ";
        if (!is_null($event["Color"])) $out .= "checked";
-       $out .= "> " . t("Special color") . ":</label>";
+       $out .= "> " . L10n::t("Special color") . ":</label>";
        $out .= "<span id='cal_color_holder' ";
        if (is_null($event["Color"])) $out .= "style='display: none;'";
        $out .= "><input name='color' id='cal_color' value='" . (is_null($event["Color"]) ? "#" . $cal_col : escape_tags($event["Color"])) . "'></span>";
        $out .= "<br>\n";
 
-       $out .= "<label class='block' for='cal_summary'>" . t("Subject") . ":</label>
+       $out .= "<label class='block' for='cal_summary'>" . L10n::t("Subject") . ":</label>
                <input name='summary' id='cal_summary' value=\"" . escape_tags($event["Summary"]) . "\"><br>\n";
        $out .= "<label class='block' for='cal_allday'>Is All-Day event:</label><input type='checkbox' name='allday' id='cal_allday' " . ($event["IsAllDayEvent"] ? "checked" : "") . "><br>\n";
 
-       $out .= "<label class='block' for='cal_start_date'>" . t("Starts") . ":</label>";
+       $out .= "<label class='block' for='cal_start_date'>" . L10n::t("Starts") . ":</label>";
        $out .= "<input name='start_date' value='" . $localization->dateformat_datepicker_php($event["StartTime"]) . "' id='cal_start_date'>";
        $out .= "<input name='start_time' value='" . date("H:i", $event["StartTime"]) . "' id='cal_start_time'>";
        $out .= "<br>\n";
 
-       $out .= "<label class='block' for='cal_end_date'>" . t("Ends") . ":</label>";
+       $out .= "<label class='block' for='cal_end_date'>" . L10n::t("Ends") . ":</label>";
        $out .= "<input name='end_date' value='" . $localization->dateformat_datepicker_php($event["EndTime"]) . "' id='cal_end_date'>";
        $out .= "<input name='end_time' value='" . date("H:i", $event["EndTime"]) . "' id='cal_end_time'>";
        $out .= "<br>\n";
 
-       $out .= "<label class='block' for='cal_location'>" . t("Location") . ":</label><input name='location' id='cal_location' value=\"" . escape_tags($event["Location"]) . "\"><br>\n";
+       $out .= "<label class='block' for='cal_location'>" . L10n::t("Location") . ":</label><input name='location' id='cal_location' value=\"" . escape_tags($event["Location"]) . "\"><br>\n";
 
-       $out .= "<label class='block' for='event-desc-textarea'>" . t("Description") . ":</label> <textarea id='event-desc-textarea' name='wdcal_desc' style='vertical-align: top; width: 400px; height: 100px;'>" . escape_tags($event["Description"]) . "</textarea>";
+       $out .= "<label class='block' for='event-desc-textarea'>" . L10n::t("Description") . ":</label> <textarea id='event-desc-textarea' name='wdcal_desc' style='vertical-align: top; width: 400px; height: 100px;'>" . escape_tags($event["Description"]) . "</textarea>";
        $out .= "<br style='clear: both;'>";
 
-       $out .= "<h2>" . t("Recurrence") . "</h2>";
+       $out .= "<h2>" . L10n::t("Recurrence") . "</h2>";
 
-       $out .= "<label class='block' for='rec_frequency'>" . t("Frequency") . ":</label> <select id='rec_frequency' name='rec_frequency' size='1'>";
-       $out .= "<option value=''>" . t("None") . "</option>\n";
+       $out .= "<label class='block' for='rec_frequency'>" . L10n::t("Frequency") . ":</label> <select id='rec_frequency' name='rec_frequency' size='1'>";
+       $out .= "<option value=''>" . L10n::t("None") . "</option>\n";
        $out .= "<option value='daily' ";
        if ($recurrence && $recurrence->frequency == "daily") $out .= "selected";
-       $out .= ">" . t("Daily") . "</option>\n";
+       $out .= ">" . L10n::t("Daily") . "</option>\n";
        $out .= "<option value='weekly' ";
        if ($recurrence && $recurrence->frequency == "weekly") $out .= "selected";
-       $out .= ">" . t("Weekly") . "</option>\n";
+       $out .= ">" . L10n::t("Weekly") . "</option>\n";
        $out .= "<option value='monthly' ";
        if ($recurrence && $recurrence->frequency == "monthly") $out .= "selected";
-       $out .= ">" . t("Monthly") . "</option>\n";
+       $out .= ">" . L10n::t("Monthly") . "</option>\n";
        $out .= "<option value='yearly' ";
        if ($recurrence && $recurrence->frequency == "yearly") $out .= "selected";
-       $out .= ">" . t("Yearly") . "</option>\n";
+       $out .= ">" . L10n::t("Yearly") . "</option>\n";
        $out .= "</select><br>\n";
        $out .= "<div id='rec_details'>";
 
@@ -211,15 +214,15 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $calendar_id, $uri)
                $select .= ">$i</option>\n";
        }
        $select .= "</select>";
-       $time = "<span class='rec_daily'>" . t("days") . "</span>";
-       $time .= "<span class='rec_weekly'>" . t("weeks") . "</span>";
-       $time .= "<span class='rec_monthly'>" . t("months") . "</span>";
-       $time .= "<span class='rec_yearly'>" . t("years") . "</span>";
-       $out .= "<label class='block'>" . t("Interval") . ":</label> " . str_replace(array("%select%", "%time%"), array($select, $time), t("All %select% %time%")) . "<br>";
+       $time = "<span class='rec_daily'>" . L10n::t("days") . "</span>";
+       $time .= "<span class='rec_weekly'>" . L10n::t("weeks") . "</span>";
+       $time .= "<span class='rec_monthly'>" . L10n::t("months") . "</span>";
+       $time .= "<span class='rec_yearly'>" . L10n::t("years") . "</span>";
+       $out .= "<label class='block'>" . L10n::t("Interval") . ":</label> " . str_replace(array("%select%", "%time%"), array($select, $time), L10n::t("All %select% %time%")) . "<br>";
 
 
        $out .= "<div class='rec_daily'>";
-       $out .= "<label class='block'>" . t("Days") . ":</label>";
+       $out .= "<label class='block'>" . L10n::t("Days") . ":</label>";
        if ($recurrence && $recurrence->byDay) {
                $byday = $recurrence->byDay;
        } else {
@@ -228,36 +231,36 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $calendar_id, $uri)
        if ($localization->getFirstDayOfWeek() == 0) {
                $out .= "<label class='plain'><input class='rec_daily_byday' type='checkbox' name='rec_daily_byday[]' value='SU' ";
                if (in_array("SU", $byday)) $out .= "checked";
-               $out .= ">" . t("Sunday") . "</label> &nbsp; ";
+               $out .= ">" . L10n::t("Sunday") . "</label> &nbsp; ";
        }
        $out .= "<label class='plain'><input class='rec_daily_byday' type='checkbox' name='rec_daily_byday[]' value='MO' ";
        if (in_array("MO", $byday)) $out .= "checked";
-       $out .= ">" . t("Monday") . "</label> &nbsp; ";
+       $out .= ">" . L10n::t("Monday") . "</label> &nbsp; ";
        $out .= "<label class='plain'><input class='rec_daily_byday' type='checkbox' name='rec_daily_byday[]' value='TU' ";
        if (in_array("TU", $byday)) $out .= "checked";
-       $out .= ">" . t("Tuesday") . "</label> &nbsp; ";
+       $out .= ">" . L10n::t("Tuesday") . "</label> &nbsp; ";
        $out .= "<label class='plain'><input class='rec_daily_byday' type='checkbox' name='rec_daily_byday[]' value='WE' ";
        if (in_array("WE", $byday)) $out .= "checked";
-       $out .= ">" . t("Wednesday") . "</label> &nbsp; ";
+       $out .= ">" . L10n::t("Wednesday") . "</label> &nbsp; ";
        $out .= "<label class='plain'><input class='rec_daily_byday' type='checkbox' name='rec_daily_byday[]' value='TH' ";
        if (in_array("TH", $byday)) $out .= "checked";
-       $out .= ">" . t("Thursday") . "</label> &nbsp; ";
+       $out .= ">" . L10n::t("Thursday") . "</label> &nbsp; ";
        $out .= "<label class='plain'><input class='rec_daily_byday' type='checkbox' name='rec_daily_byday[]' value='FR' ";
        if (in_array("FR", $byday)) $out .= "checked";
-       $out .= ">" . t("Friday") . "</label> &nbsp; ";
+       $out .= ">" . L10n::t("Friday") . "</label> &nbsp; ";
        $out .= "<label class='plain'><input class='rec_daily_byday' type='checkbox' name='rec_daily_byday[]' value='SA' ";
        if (in_array("SA", $byday)) $out .= "checked";
-       $out .= ">" . t("Saturday") . "</label> &nbsp; ";
+       $out .= ">" . L10n::t("Saturday") . "</label> &nbsp; ";
        if ($localization->getFirstDayOfWeek() != 0) {
                $out .= "<label class='plain'><input class='rec_daily_byday' type='checkbox' name='rec_daily_byday[]' value='SU' ";
                if (in_array("SU", $byday)) $out .= "checked";
-               $out .= ">" . t("Sunday") . "</label> &nbsp; ";
+               $out .= ">" . L10n::t("Sunday") . "</label> &nbsp; ";
        }
        $out .= "</div>";
 
 
        $out .= "<div class='rec_weekly'>";
-       $out .= "<label class='block'>" . t("Days") . ":</label>";
+       $out .= "<label class='block'>" . L10n::t("Days") . ":</label>";
        if ($recurrence && $recurrence->byDay) {
                $byday = $recurrence->byDay;
        } else {
@@ -267,34 +270,34 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $calendar_id, $uri)
        if ($localization->getFirstDayOfWeek() == 0) {
                $out .= "<label class='plain'><input class='rec_weekly_byday' type='checkbox' name='rec_weekly_byday[]' value='SU' ";
                if (in_array("SU", $byday)) $out .= "checked";
-               $out .= ">" . t("Sunday") . "</label> &nbsp; ";
+               $out .= ">" . L10n::t("Sunday") . "</label> &nbsp; ";
        }
        $out .= "<label class='plain'><input class='rec_weekly_byday' type='checkbox' name='rec_weekly_byday[]' value='MO' ";
        if (in_array("MO", $byday)) $out .= "checked";
-       $out .= ">" . t("Monday") . "</label> &nbsp; ";
+       $out .= ">" . L10n::t("Monday") . "</label> &nbsp; ";
        $out .= "<label class='plain'><input class='rec_weekly_byday' type='checkbox' name='rec_weekly_byday[]' value='TU' ";
        if (in_array("TU", $byday)) $out .= "checked";
-       $out .= ">" . t("Tuesday") . "</label> &nbsp; ";
+       $out .= ">" . L10n::t("Tuesday") . "</label> &nbsp; ";
        $out .= "<label class='plain'><input class='rec_weekly_byday' type='checkbox' name='rec_weekly_byday[]' value='WE' ";
        if (in_array("WE", $byday)) $out .= "checked";
-       $out .= ">" . t("Wednesday") . "</label> &nbsp; ";
+       $out .= ">" . L10n::t("Wednesday") . "</label> &nbsp; ";
        $out .= "<label class='plain'><input class='rec_weekly_byday' type='checkbox' name='rec_weekly_byday[]' value='TH' ";
        if (in_array("TH", $byday)) $out .= "checked";
-       $out .= ">" . t("Thursday") . "</label> &nbsp; ";
+       $out .= ">" . L10n::t("Thursday") . "</label> &nbsp; ";
        $out .= "<label class='plain'><input class='rec_weekly_byday' type='checkbox' name='rec_weekly_byday[]' value='FR' ";
        if (in_array("FR", $byday)) $out .= "checked";
-       $out .= ">" . t("Friday") . "</label> &nbsp; ";
+       $out .= ">" . L10n::t("Friday") . "</label> &nbsp; ";
        $out .= "<label class='plain'><input class='rec_weekly_byday' type='checkbox' name='rec_weekly_byday[]' value='SA' ";
        if (in_array("SA", $byday)) $out .= "checked";
-       $out .= ">" . t("Saturday") . "</label> &nbsp; ";
+       $out .= ">" . L10n::t("Saturday") . "</label> &nbsp; ";
        if ($localization->getFirstDayOfWeek() != 0) {
                $out .= "<label class='plain'><input class='rec_weekly_byday' type='checkbox' name='rec_weekly_byday[]' value='SU' ";
                if (in_array("SU", $byday)) $out .= "checked";
-               $out .= ">" . t("Sunday") . "</label> &nbsp; ";
+               $out .= ">" . L10n::t("Sunday") . "</label> &nbsp; ";
        }
        $out .= "<br>";
 
-       $out .= "<label class='block'>" . t("First day of week:") . "</label>";
+       $out .= "<label class='block'>" . L10n::t("First day of week:") . "</label>";
        if ($recurrence && $recurrence->weekStart != "") $wkst = $recurrence->weekStart;
        else {
                if ($localization->getFirstDayOfWeek() == 0) $wkst = "SU";
@@ -302,10 +305,10 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $calendar_id, $uri)
        }
        $out .= "<label class='plain'><input type='radio' name='rec_weekly_wkst' value='SU' ";
        if ($wkst == "SU") $out .= "checked";
-       $out .= ">" . t("Sunday") . "</label> &nbsp; ";
+       $out .= ">" . L10n::t("Sunday") . "</label> &nbsp; ";
        $out .= "<label class='plain'><input type='radio' name='rec_weekly_wkst' value='MO' ";
        if ($wkst == "MO") $out .= "checked";
-       $out .= ">" . t("Monday") . "</label><br>\n";
+       $out .= ">" . L10n::t("Monday") . "</label><br>\n";
 
        $out .= "</div>";
 
@@ -347,20 +350,20 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $calendar_id, $uri)
        }
 
        $out .= "<div class='rec_monthly'>";
-       $out .= "<label class='block' for='rec_monthly_day'>" . t("Day of month") . ":</label>";
+       $out .= "<label class='block' for='rec_monthly_day'>" . L10n::t("Day of month") . ":</label>";
        $out .= "<select id='rec_monthly_day' name='rec_monthly_day' size='1'>";
        $out .= "<option value='bymonthday' ";
        if ($monthly_rule == "bymonthday") $out .= "selected";
-       $out .= ">" . t("#num#th of each month") . "</option>\n";
+       $out .= ">" . L10n::t("#num#th of each month") . "</option>\n";
        $out .= "<option value='bymonthday_neg' ";
        if ($monthly_rule == "bymonthday_neg") $out .= "selected";
-       $out .= ">" . t("#num#th-last of each month") . "</option>\n";
+       $out .= ">" . L10n::t("#num#th-last of each month") . "</option>\n";
        $out .= "<option value='byday' ";
        if ($monthly_rule == "byday") $out .= "selected";
-       $out .= ">" . t("#num#th #wkday# of each month") . "</option>\n";
+       $out .= ">" . L10n::t("#num#th #wkday# of each month") . "</option>\n";
        $out .= "<option value='byday_neg' ";
        if ($monthly_rule == "byday_neg") $out .= "selected";
-       $out .= ">" . t("#num#th-last #wkday# of each month") . "</option>\n";
+       $out .= ">" . L10n::t("#num#th-last #wkday# of each month") . "</option>\n";
        $out .= "</select>";
        $out .= "</div>\n";
 
@@ -369,21 +372,21 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $calendar_id, $uri)
        }
 
        $out .= "<div class='rec_yearly'>";
-       $out .= "<label class='block'>" . t("Month") . ":</label> <span class='rec_month_name'>#month#</span><br>\n";
-       $out .= "<label class='block' for='rec_yearly_day'>" . t("Day of month") . ":</label>";
+       $out .= "<label class='block'>" . L10n::t("Month") . ":</label> <span class='rec_month_name'>#month#</span><br>\n";
+       $out .= "<label class='block' for='rec_yearly_day'>" . L10n::t("Day of month") . ":</label>";
        $out .= "<select id='rec_yearly_day' name='rec_yearly_day' size='1'>";
        $out .= "<option value='bymonthday' ";
        if ($monthly_rule == "bymonthday") $out .= "selected";
-       $out .= ">" . t("#num#th of the given month") . "</option>\n";
+       $out .= ">" . L10n::t("#num#th of the given month") . "</option>\n";
        $out .= "<option value='bymonthday_neg' ";
        if ($monthly_rule == "bymonthday_neg") $out .= "selected";
-       $out .= ">" . t("#num#th-last of the given month") . "</option>\n";
+       $out .= ">" . L10n::t("#num#th-last of the given month") . "</option>\n";
        $out .= "<option value='byday' ";
        if ($monthly_rule == "byday") $out .= "selected";
-       $out .= ">" . t("#num#th #wkday# of the given month") . "</option>\n";
+       $out .= ">" . L10n::t("#num#th #wkday# of the given month") . "</option>\n";
        $out .= "<option value='byday_neg' ";
        if ($monthly_rule == "byday_neg") $out .= "selected";
-       $out .= ">" . t("#num#th-last #wkday# of the given month") . "</option>\n";
+       $out .= ">" . L10n::t("#num#th-last #wkday# of the given month") . "</option>\n";
        $out .= "</select>";
        $out .= "</div>\n";
 
@@ -410,26 +413,26 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $calendar_id, $uri)
                $rule_until_date  = time();
                $rule_until_count = 1;
        }
-       $out .= "<label class='block' for='rec_until_type'>" . t("Repeat until") . ":</label> ";
+       $out .= "<label class='block' for='rec_until_type'>" . L10n::t("Repeat until") . ":</label> ";
        $out .= "<select name='rec_until_type' id='rec_until_type' size='1'>";
        $out .= "<option value='infinite' ";
        if ($rule_type == "infinite") $out .= "selected";
-       $out .= ">" . t("Infinite") . "</option>\n";
+       $out .= ">" . L10n::t("Infinite") . "</option>\n";
        $out .= "<option value='date' ";
        if ($rule_type == "date") $out .= "selected";
-       $out .= ">" . t("Until the following date") . ":</option>\n";
+       $out .= ">" . L10n::t("Until the following date") . ":</option>\n";
        $out .= "<option value='count' ";
        if ($rule_type == "count") $out .= "selected";
-       $out .= ">" . t("Number of times") . ":</option>\n";
+       $out .= ">" . L10n::t("Number of times") . ":</option>\n";
        $out .= "</select>";
 
        $out .= "<input name='rec_until_date' value='" . $localization->dateformat_datepicker_php($rule_until_date) . "' id='rec_until_date'>";
        $out .= "<input name='rec_until_count' value='$rule_until_count' id='rec_until_count'><br>";
 
-       $out .= "<label class='block'>" . t("Exceptions") . ":</label><div class='rec_exceptions'>";
+       $out .= "<label class='block'>" . L10n::t("Exceptions") . ":</label><div class='rec_exceptions'>";
        $out .= "<div class='rec_exceptions_none' ";
        if (count($recurrentce_exdates) > 0) $out .= "style='display: none;'";
-       $out .= ">" . t("none") . "</div>";
+       $out .= ">" . L10n::t("none") . "</div>";
        $out .= "<div class='rec_exceptions_holder' ";
        if (count($recurrentce_exdates) == 0) $out .= "style='display: none;'";
        $out .= ">";
@@ -446,7 +449,7 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $calendar_id, $uri)
 
        $out .= "</div><br>";
 
-       $out .= "<h2>" . t("Notification") . "</h2>";
+       $out .= "<h2>" . L10n::t("Notification") . "</h2>";
 
        if (!$notifications) $notifications = array();
        $notifications["new"] = array(
@@ -463,33 +466,33 @@ function wdcal_getEditPage_str(&$localization, $baseurl, $calendar_id, $uri)
 
                $out .= "<div class='noti_holder' ";
                if (!is_numeric($index) && $index == "new") $out .= "style='display: none;' id='noti_new_row'";
-               $out .= "><label class='block' for='noti_type_" . $index . "'>" . t("Notify by") . ":</label>";
+               $out .= "><label class='block' for='noti_type_" . $index . "'>" . L10n::t("Notify by") . ":</label>";
                $out .= "<select name='noti_type[$index]' size='1' id='noti_type_" . $index . "'>";
-               $out .= "<option value=''>- " . t("Remove") . " -</option>\n";
-               $out .= "<option value='email' "; if (!$unparsable && $noti["action"] == "email") $out .= "selected"; $out .= ">" . t("E-Mail") . "</option>\n";
-               $out .= "<option value='display' "; if (!$unparsable && $noti["action"] == "display") $out .= "selected"; $out .= ">" . t("On Friendica / Display") . "</option>\n";
-               //$out .= "<option value='other' "; if ($unparsable) $out .= "selected"; $out .= ">- " . t("other (leave it untouched)") . " -</option>\n"; // @TODO
+               $out .= "<option value=''>- " . L10n::t("Remove") . " -</option>\n";
+               $out .= "<option value='email' "; if (!$unparsable && $noti["action"] == "email") $out .= "selected"; $out .= ">" . L10n::t("E-Mail") . "</option>\n";
+               $out .= "<option value='display' "; if (!$unparsable && $noti["action"] == "display") $out .= "selected"; $out .= ">" . L10n::t("On Friendica / Display") . "</option>\n";
+               //$out .= "<option value='other' "; if ($unparsable) $out .= "selected"; $out .= ">- " . L10n::t("other (leave it untouched)") . " -</option>\n"; // @TODO
                $out .= "</select><br>";
 
-               $out .= "<label class='block'>" . t("Time") . ":</label>";
+               $out .= "<label class='block'>" . L10n::t("Time") . ":</label>";
                $out .= "<input name='noti_value[$index]' size='5' style='width: 5em;' value='" . $noti["trigger_value"] . "'>";
 
                $out .= "<select name='noti_unit[$index]' size='1'>";
-               $out .= "<option value='H' "; if ($noti["trigger_unit"] == "hour") $out .= "selected"; $out .= ">" . t("Hours") . "</option>\n";
-               $out .= "<option value='M' "; if ($noti["trigger_unit"] == "minute") $out .= "selected"; $out .= ">" . t("Minutes") . "</option>\n";
-               $out .= "<option value='S' "; if ($noti["trigger_unit"] == "second") $out .= "selected"; $out .= ">" . t("Seconds") . "</option>\n";
-               $out .= "<option value='D' "; if ($noti["trigger_unit"] == "day") $out .= "selected"; $out .= ">" . t("Days") . "</option>\n";
-               $out .= "<option value='W' "; if ($noti["trigger_unit"] == "week") $out .= "selected"; $out .= ">" . t("Weeks") . "</option>\n";
+               $out .= "<option value='H' "; if ($noti["trigger_unit"] == "hour") $out .= "selected"; $out .= ">" . L10n::t("Hours") . "</option>\n";
+               $out .= "<option value='M' "; if ($noti["trigger_unit"] == "minute") $out .= "selected"; $out .= ">" . L10n::t("Minutes") . "</option>\n";
+               $out .= "<option value='S' "; if ($noti["trigger_unit"] == "second") $out .= "selected"; $out .= ">" . L10n::t("Seconds") . "</option>\n";
+               $out .= "<option value='D' "; if ($noti["trigger_unit"] == "day") $out .= "selected"; $out .= ">" . L10n::t("Days") . "</option>\n";
+               $out .= "<option value='W' "; if ($noti["trigger_unit"] == "week") $out .= "selected"; $out .= ">" . L10n::t("Weeks") . "</option>\n";
                $out .= "</select>";
 
-               $out .= " <label class='plain'>" . t("before the") . " <select name='noti_ref[$index]' size='1'>";
-               $out .= "<option value='start' "; if ($noti["rel"] == "start") $out .= "selected"; $out .= ">" . t("start of the event") . "</option>\n";
-               $out .= "<option value='end' "; if ($noti["rel"] == "end") $out .= "selected"; $out .= ">" . t("end of the event") . "</option>\n";
+               $out .= " <label class='plain'>" . L10n::t("before the") . " <select name='noti_ref[$index]' size='1'>";
+               $out .= "<option value='start' "; if ($noti["rel"] == "start") $out .= "selected"; $out .= ">" . L10n::t("start of the event") . "</option>\n";
+               $out .= "<option value='end' "; if ($noti["rel"] == "end") $out .= "selected"; $out .= ">" . L10n::t("end of the event") . "</option>\n";
                $out .= "</select></label>\n";
 
                $out .= "</div>";
        }
-       $out .= "<input type='hidden' name='new_alarm' id='new_alarm' value='0'><div id='new_alarm_adder'><a href='#'>" . t("Add a notification") . "</a></div>";
+       $out .= "<input type='hidden' name='new_alarm' id='new_alarm' value='0'><div id='new_alarm_adder'><a href='#'>" . L10n::t("Add a notification") . "</a></div>";
 
        $out .= "<script>\$(function() {
                wdcal_edit_init('" . $localization->dateformat_datepicker_js() . "', '${baseurl}/dav/');
@@ -518,9 +521,9 @@ function wdcal_set_component_date(&$component, &$localization)
                $type     = Sabre\VObject\Property\DateTime::LOCALTZ;
        }
        $datetime_start = new Sabre\VObject\Property\DateTime("DTSTART");
-       $datetime_start->setDateTime(new DateTime(date("Y-m-d H:i:s", $ts_start)), $type);
+       $datetime_start->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, $ts_start)), $type);
        $datetime_end = new Sabre\VObject\Property\DateTime("DTEND");
-       $datetime_end->setDateTime(new DateTime(date("Y-m-d H:i:s", $ts_end)), $type);
+       $datetime_end->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, $ts_end)), $type);
 
        $component->__unset("DTSTART");
        $component->__unset("DTEND");
@@ -596,7 +599,7 @@ function wdcal_set_component_recurrence(&$component, &$localization)
                        $date           = $localization->date_local2timestamp($_REQUEST["rec_until_date"]);
                        $part_until     = ";UNTIL=" . date("Ymd", $date);
                        $datetime_until = new Sabre\VObject\Property\DateTime("UNTIL");
-                       $datetime_until->setDateTime(new DateTime(date("Y-m-d H:i:s", $date)), Sabre\VObject\Property\DateTime::DATE);
+                       $datetime_until->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, $date)), Sabre\VObject\Property\DateTime::DATE);
                        break;
                case "count":
                        $part_until = ";COUNT=" . IntVal($_REQUEST["rec_until_count"]);
@@ -643,7 +646,7 @@ function wdcal_set_component_recurrence(&$component, &$localization)
        if (isset($_REQUEST["rec_exceptions"])) {
                $arr = array();
                foreach ($_REQUEST["rec_exceptions"] as $except) {
-                       $arr[] = new DateTime(date("Y-m-d H:i:s", $except));
+                       $arr[] = new DateTime(date(DateTimeFormat::MYSQL, $except));
                }
                /** @var Sabre\VObject\Property\MultiDateTime $prop */
                $prop = Sabre\VObject\Property::create("EXDATE");
@@ -684,7 +687,7 @@ function wdcal_set_component_alerts(&$component, &$localization, $summary, $dtst
                                        "#date#", "#name",
                                ), array(
                                        $localization->date_timestamp2local($dtstart), $summary,
-                               ), t("The event #name# will start at #date"));
+                               ), L10n::t("The event #name# will start at #date"));
 
                                $alarm->add(new Sabre\VObject\Property("ACTION", "EMAIL"));
                                $alarm->add(new Sabre\VObject\Property("SUMMARY", $summary));
@@ -693,7 +696,7 @@ function wdcal_set_component_alerts(&$component, &$localization, $summary, $dtst
                                break;
                        case "display":
                                $alarm->add(new Sabre\VObject\Property("ACTION", "DISPLAY"));
-                               $text = str_replace("#name#", $summary, t("#name# is about to begin."));
+                               $text = str_replace("#name#", $summary, L10n::t("#name# is about to begin."));
                                $alarm->add(new Sabre\VObject\Property("DESCRIPTION", $text));
                                break;
                        default:
@@ -735,7 +738,7 @@ function wdcal_postEditPage($uri, $uid = 0, $timezone = "", $goaway_url = "")
                $vObject   = dav_get_current_user_calendarobject($server, $calendar, $obj_uri, DAV_ACL_WRITE);
                $component = dav_get_eventComponent($vObject);
 
-               if ($component == null) return array("ok" => false, "msg" => t('Could not open component for editing'));
+               if ($component == null) return array("ok" => false, "msg" => L10n::t('Could not open component for editing'));
        } else {
                $calendar  = dav_get_current_user_calendar_by_id($server, $_REQUEST["calendar"], DAV_ACL_WRITE);
                $vObject   = dav_create_empty_vevent();
@@ -766,7 +769,7 @@ function wdcal_postEditPage($uri, $uid = 0, $timezone = "", $goaway_url = "")
                $obj = $calendar->getChild($obj_uri);
                $obj->put($data);
        }
-       return array("ok" => false, "msg" => t("Saved"));
+       return array("ok" => false, "msg" => L10n::t("Saved"));
 }
 
 
index 60dd9c6bd190a4e9f97ad5570218398d4a4405a4..98e552e6f6952261744391250cd53a523b308f84 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Friendica\Core\L10n;
+
 $a    = get_app();
 $uri  = parse_url($a->get_baseurl());
 $path = "/";
@@ -202,11 +204,11 @@ function wdcal_create_std_calendars_get_statements($user_id, $withcheck = true)
 {
        $stms = array();
        $a = get_app();
-       $uris = array(
-               'private'                 => t("Private Calendar"),
-               CALDAV_FRIENDICA_MINE     => t("Friendica Events: Mine"),
-               CALDAV_FRIENDICA_CONTACTS => t("Friendica Events: Contacts"),
-       );
+       $uris = [
+               'private'                 => L10n::t("Private Calendar"),
+               CALDAV_FRIENDICA_MINE     => L10n::t("Friendica Events: Mine"),
+               CALDAV_FRIENDICA_CONTACTS => L10n::t("Friendica Events: Contacts"),
+       ];
        foreach ($uris as $uri => $name) {
                $cals = q("SELECT * FROM %s%scalendars WHERE `namespace` = %d AND `namespace_id` = %d AND `uri` = '%s'",
                        CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_PRIVATE, IntVal($user_id), dbesc($uri));
@@ -244,10 +246,10 @@ function wdcal_create_std_addressbooks_get_statements($user_id, $withcheck = tru
 {
        $stms = array();
        $a = get_app();
-       $uris = array(
-               'private'                 => t("Private Addresses"),
-               CARDDAV_FRIENDICA_CONTACT     => t("Friendica Contacts"),
-       );
+       $uris = [
+               'private'                 => L10n::t("Private Addresses"),
+               CARDDAV_FRIENDICA_CONTACT     => L10n::t("Friendica Contacts"),
+       ];
        foreach ($uris as $uri => $name) {
                $cals = q("SELECT * FROM %s%saddressbooks WHERE `namespace` = %d AND `namespace_id` = %d AND `uri` = '%s'",
                        CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_PRIVATE, IntVal($user_id), dbesc($uri));
index 0afc03bd74406087643b92e473bc1221d0bac3dc..c108d8dcfec73bc7952c087be55a917d3805c228 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+use Friendica\Core\L10n;
+use Friendica\Util\DateTimeFormat;
+
 class Sabre_CalDAV_Backend_Friendica extends Sabre_CalDAV_Backend_Virtual
 {
 
@@ -33,7 +36,7 @@ class Sabre_CalDAV_Backend_Friendica extends Sabre_CalDAV_Backend_Virtual
         * @return string
         */
        public static function getBackendTypeName() {
-               return t("Friendica-Native events");
+               return L10n::t("Friendica-Native events");
        }
 
        /**
@@ -65,8 +68,8 @@ class Sabre_CalDAV_Backend_Friendica extends Sabre_CalDAV_Backend_Virtual
                        $component = dav_get_eventComponent($vevent);
 
                        if ($row["adjust"]) {
-                               $start  = datetime_convert('UTC', date_default_timezone_get(), $row["start"]);
-                               $finish = datetime_convert('UTC', date_default_timezone_get(), $row["finish"]);
+                               $start  = DateTimeFormat::local($row["start"]);
+                               $finish = DateTimeFormat::local($row["finish"]);
                        } else {
                                $start  = $row["start"];
                                $finish = $row["finish"];
@@ -85,9 +88,9 @@ class Sabre_CalDAV_Backend_Friendica extends Sabre_CalDAV_Backend_Virtual
                        $type           = ($allday ? Sabre\VObject\Property\DateTime::DATE : Sabre\VObject\Property\DateTime::LOCALTZ);
 
                        $datetime_start = new Sabre\VObject\Property\DateTime("DTSTART");
-                       $datetime_start->setDateTime(new DateTime(date("Y-m-d H:i:s", $ts_start)), $type);
+                       $datetime_start->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, $ts_start)), $type);
                        $datetime_end = new Sabre\VObject\Property\DateTime("DTEND");
-                       $datetime_end->setDateTime(new DateTime(date("Y-m-d H:i:s", $ts_end)), $type);
+                       $datetime_end->setDateTime(new DateTime(date(DateTimeFormat::MYSQL, $ts_end)), $type);
 
                        $component->add($datetime_start);
                        $component->add($datetime_end);
@@ -113,8 +116,8 @@ class Sabre_CalDAV_Backend_Friendica extends Sabre_CalDAV_Backend_Virtual
        private function jqcal2wdcal($row, $calendar, $base_path)
        {
                if ($row["adjust"]) {
-                       $start  = datetime_convert('UTC', date_default_timezone_get(), $row["start"]);
-                       $finish = datetime_convert('UTC', date_default_timezone_get(), $row["finish"]);
+                       $start  = DateTimeFormat::local($row["start"]);
+                       $finish = DateTimeFormat::local($row["finish"]);
                } else {
                        $start  = $row["start"];
                        $finish = $row["finish"];
@@ -172,11 +175,11 @@ class Sabre_CalDAV_Backend_Friendica extends Sabre_CalDAV_Backend_Virtual
                }
 
                if ($date_from != "") {
-                       if (is_numeric($date_from)) $sql_where .= " AND `finish` >= '" . date("Y-m-d H:i:s", $date_from) . "'";
+                       if (is_numeric($date_from)) $sql_where .= " AND `finish` >= '" . date(DateTimeFormat::MYSQL, $date_from) . "'";
                        else $sql_where .= " AND `finish` >= '" . dbesc($date_from) . "'";
                }
                if ($date_to != "") {
-                       if (is_numeric($date_to)) $sql_where .= " AND `start` <= '" . date("Y-m-d H:i:s", $date_to) . "'";
+                       if (is_numeric($date_to)) $sql_where .= " AND `start` <= '" . date(DateTimeFormat::MYSQL, $date_to) . "'";
                        else $sql_where .= " AND `start` <= '" . dbesc($date_to) . "'";
                }
                $ret = array();
index 3a06d042b5290dbac039d401fea00ae932d19683..0240241fb53f338e7b8810212c2cd76f6350e37b 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Friendica\Core\L10n;
+
 class Sabre_CardDAV_Backend_Friendica extends Sabre_CardDAV_Backend_Virtual
 {
 
@@ -33,7 +35,7 @@ class Sabre_CardDAV_Backend_Friendica extends Sabre_CardDAV_Backend_Virtual
         * @return string
         */
        public static function getBackendTypeName() {
-               return t("Friendica-Contacts");
+               return L10n::t("Friendica-Contacts");
        }
 
        /**
@@ -56,8 +58,8 @@ class Sabre_CardDAV_Backend_Friendica extends Sabre_CardDAV_Backend_Virtual
                        'id'                                                                => $books[0]["id"],
                        'uri'                                                               => "friendica",
                        'principaluri'                                                      => $principalUri,
-                       '{DAV:}displayname'                                                 => t("Friendica-Contacts"),
-                       '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' => t("Your Friendica-Contacts"),
+                       '{DAV:}displayname'                                                 => L10n::t("Friendica-Contacts"),
+                       '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' => L10n::t("Your Friendica-Contacts"),
                        '{http://calendarserver.org/ns/}getctag'                            => $ctag,
                        '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}supported-address-data'  =>
                        new Sabre_CardDAV_Property_SupportedAddressData(),
index 80a9ae2d0064c26669110434e79b9c3281b746f2..17196e2211df9f2e3197d5a83422939d11aca86c 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 /**
  *
@@ -96,7 +99,7 @@ function wdcal_import_user_ics($calendar_id) {
                                if (!isset($imported[$uid])) $imported[$uid] = "";
                                $imported[$uid] .= $c->serialize();
                        } catch (Exception $e) {
-                               notice(t("Something went wrong when trying to import the file. Sorry. Maybe some events were imported anyway."));
+                               notice(L10n::t("Something went wrong when trying to import the file. Sorry. Maybe some events were imported anyway."));
                        }
 
                        if (isset($_REQUEST["overwrite"])) {
@@ -128,28 +131,28 @@ function wdcal_import_user_ics($calendar_id) {
                                $calendar->createFile("import-" . $i . ".ics", $str);
                                $i++;
                        } catch (Exception $e) {
-                               notice(t("Something went wrong when trying to import the file. Sorry."));
+                               notice(L10n::t("Something went wrong when trying to import the file. Sorry."));
                        }
 
-                       $o = t("The ICS-File has been imported.");
+                       $o = L10n::t("The ICS-File has been imported.");
                } catch (Exception $e) {
-                       notice(t("Something went wrong when trying to import the file. Sorry. Maybe some events were imported anyway."));
+                       notice(L10n::t("Something went wrong when trying to import the file. Sorry. Maybe some events were imported anyway."));
                } else {
-                       notice(t("No file was uploaded."));
+                       notice(L10n::t("No file was uploaded."));
                }
        }
 
 
-       $o .= "<a href='" . $a->get_baseurl() . "/dav/wdcal/'>" . t("Go back to the calendar") . "</a><br><br>";
+       $o .= "<a href='" . $a->get_baseurl() . "/dav/wdcal/'>" . L10n::t("Go back to the calendar") . "</a><br><br>";
 
        $num = q("SELECT COUNT(*) num FROM %s%scalendarobjects WHERE `calendar_id` = %d", CALDAV_SQL_DB, CALDAV_SQL_PREFIX, $calendar_id);
 
-       $o .= "<h2>" . t("Import a ICS-file") . "</h2>";
+       $o .= "<h2>" . L10n::t("Import a ICS-file") . "</h2>";
        $o .= '<form method="POST" action="' . $a->get_baseurl() . '/dav/wdcal/' . $calendar_id . '/ics-import/" enctype="multipart/form-data">';
        $o .= "<input type='hidden' name='form_security_token' value='" . get_form_security_token('icsimport') . "'>\n";
-       $o .= "<label for='ics_file'>" . t("ICS-File") . "</label><input type='file' name='ics_file' id='ics_file'><br>\n";
-       if ($num[0]["num"] > 0) $o .= "<label for='overwrite'>" . str_replace("#num#", $num[0]["num"], t("Overwrite all #num# existing events")) . "</label> <input name='overwrite' id='overwrite' type='checkbox'><br>\n";
-       $o .= "<input type='submit' name='save' value='" . t("Upload") . "'>";
+       $o .= "<label for='ics_file'>" . L10n::t("ICS-File") . "</label><input type='file' name='ics_file' id='ics_file'><br>\n";
+       if ($num[0]["num"] > 0) $o .= "<label for='overwrite'>" . str_replace("#num#", $num[0]["num"], L10n::t("Overwrite all #num# existing events")) . "</label> <input name='overwrite' id='overwrite' type='checkbox'><br>\n";
+       $o .= "<input type='submit' name='save' value='" . L10n::t("Upload") . "'>";
        $o .= '</form>';
 
        return $o;
@@ -222,14 +225,14 @@ function wdcal_printCalendar($calendars, $calendars_selected, $data_feed_url, $v
 
                $x .= '<div class="ctoolbar">
                <div class="fbutton faddbtn" style="float: right;">
-                       <div><a href="' . $a->get_baseurl() . '/dav/settings/"><span>' . t("Settings") . ' / ' . t("Help") . '</span></a></div>
+                       <div><a href="' . $a->get_baseurl() . '/dav/settings/"><span>' . L10n::t("Settings") . ' / ' . L10n::t("Help") . '</span></a></div>
                </div>
                <div class="fbutton addcal">
-                       <div><a href="' . $a->get_baseurl() . '/dav/wdcal/new/" class="addcal">' . t("New event") . '</a></div>
+                       <div><a href="' . $a->get_baseurl() . '/dav/wdcal/new/" class="addcal">' . L10n::t("New event") . '</a></div>
                </div>
                <div class="btnseparator"></div>
                <div class="fbutton showtodaybtn">
-                       <div><span class="showtoday">' . t("Today") . '</span></div>
+                       <div><span class="showtoday">' . L10n::t("Today") . '</span></div>
                </div>
                <div class="btnseparator"></div>
 
@@ -238,37 +241,37 @@ function wdcal_printCalendar($calendars, $calendars_selected, $data_feed_url, $v
 
                if ($view == "day") $x .= 'fcurrent';
 
-               $x .= '">' . t("Day") . '</span></div>
+               $x .= '">' . L10n::t("Day") . '</span></div>
                </div>
                <div class="fbutton showweekbtn ';
 
                if ($view == "week") $x .= "fcurrent";
 
                $x .= '">
-                       <div><span title="Week" class="showweekview">' . t("Week") . '</span></div>
+                       <div><span title="Week" class="showweekview">' . L10n::t("Week") . '</span></div>
                </div>
                <div class="showmonthbtn fbutton ';
 
                if ($view == "month") $x .= 'fcurrent';
 
                $x .= '">
-                       <div><span title="Month" class="showmonthview">' . t("Month") . '</span></div>
+                       <div><span title="Month" class="showmonthview">' . L10n::t("Month") . '</span></div>
 
                </div>
                <div class="btnseparator"></div>
                <div class="fbutton showreflashbtn">
-                       <div><span class="showdayflash">' . t("Reload") . '</span></div>
+                       <div><span class="showdayflash">' . L10n::t("Reload") . '</span></div>
                </div>
                <div class="btnseparator"></div>
-               <div title="' . t("Previous") . '"  class="fbutton sfprevbtn">
+               <div title="' . L10n::t("Previous") . '"  class="fbutton sfprevbtn">
                        <span class="fprev"></span>
                </div>
-               <div title="' . t("Next") . '" class="fbutton sfnextbtn">
+               <div title="' . L10n::t("Next") . '" class="fbutton sfnextbtn">
                        <span class="fnext"></span>
                </div>
                <div class="fshowdatep fbutton" style="white-space: nowrap; position: relative;">
                        <input name="txtshow" class="hdtxtshow" style="position: absolute; bottom: 0; left: 0; width: 0; height: 0; border: 0; padding: 0; margin: 0;">
-                       <span class="txtdatetimeshow">' . t("Date") . '</span>
+                       <span class="txtdatetimeshow">' . L10n::t("Date") . '</span>
                </div>
                <div style="float: right;">
                        <div class="clear"></div>
@@ -310,8 +313,8 @@ function wdcal_getDetailPage($calendar_id, $calendarobject_id)
 
                $details = $obj;
        } catch (Exception $e) {
-               info(t("Error") . ": " . $e);
-               goaway($a->get_baseurl() . "/dav/wdcal/");
+               info(L10n::t("Error") . ": " . $e);
+               goaway('dav/wdcal/');
        }
 
        return print_r($details, true);
@@ -351,14 +354,14 @@ function wdcal_getSettingsPage(&$a)
 {
 
        if (!local_user()) {
-               notice(t('Permission denied.') . EOL);
+               notice(L10n::t('Permission denied.') . EOL);
                return '';
        }
 
        if (isset($_REQUEST["save"])) {
                check_form_security_token_redirectOnErr('/dav/settings/', 'calprop');
-               set_pconfig($a->user["uid"], "dav", "dateformat", $_REQUEST["wdcal_date_format"]);
-               info(t('The new values have been saved.'));
+               PConfig::set($a->user["uid"], "dav", "dateformat", $_REQUEST["wdcal_date_format"]);
+               info(L10n::t('The new values have been saved.'));
        }
 
        if (isset($_REQUEST["save_cals"])) {
@@ -377,7 +380,7 @@ function wdcal_getSettingsPage(&$a)
                        if ($change_sql != "") {
                                q("UPDATE %s%scalendars SET `ctag` = `ctag` + 1 $change_sql WHERE `id` = %d AND `namespace_id` = %d AND `namespace_id` = %d",
                                        CALDAV_SQL_DB, CALDAV_SQL_PREFIX, $cal["id"], CALDAV_NAMESPACE_PRIVATE, IntVal($a->user["uid"]));
-                               info(t('The calendar has been updated.'));
+                               info(L10n::t('The calendar has been updated.'));
                        }
                }
 
@@ -390,7 +393,7 @@ function wdcal_getSettingsPage(&$a)
                                CALDAV_SQL_DB, CALDAV_SQL_PREFIX, CALDAV_NAMESPACE_PRIVATE, IntVal($a->user["uid"]), $neworder, dbesc(strtolower(substr($_REQUEST["color"]["new"], 1))),
                                dbesc($_REQUEST["name"]["new"]), dbesc($a->timezone), dbesc($_REQUEST["uri"]["new"])
                        );
-                       info(t('The new calendar has been created.'));
+                       info(L10n::t('The new calendar has been created.'));
                }
        }
 
@@ -414,20 +417,20 @@ function wdcal_getSettingsPage(&$a)
                q("DELETE FROM %s%scalendars WHERE `id` = %s", CALDAV_SQL_DB, CALDAV_SQL_PREFIX, IntVal($_REQUEST["remove_cal"]));
                q("UPDATE %s%scalendars SET `ctag` = `ctag` + 1 WHERE `id` = " . CALDAV_SQL_DB, CALDAV_SQL_PREFIX, $newcal[0]["id"]);
 
-               info(t('The calendar has been deleted.'));
+               info(L10n::t('The calendar has been deleted.'));
        }
 
        $o = "";
 
-       $o .= "<a href='" . $a->get_baseurl() . "/dav/wdcal/'>" . t("Go back to the calendar") . "</a><br><br>";
+       $o .= "<a href='" . $a->get_baseurl() . "/dav/wdcal/'>" . L10n::t("Go back to the calendar") . "</a><br><br>";
 
-       $o .= '<h3>' . t('Calendar Settings') . '</h3>';
+       $o .= '<h3>' . L10n::t('Calendar Settings') . '</h3>';
 
        $current_format = wdcal_local::getInstanceByUser($a->user["uid"]);
        $o .= '<form method="POST" action="' . $a->get_baseurl() . '/dav/settings/">';
        $o .= "<input type='hidden' name='form_security_token' value='" . get_form_security_token('calprop') . "'>\n";
 
-       $o .= '<label for="wdcal_date_format">' . t('Date format') . ':</label><select name="wdcal_date_format" id="wdcal_date_format" size="1">';
+       $o .= '<label for="wdcal_date_format">' . L10n::t('Date format') . ':</label><select name="wdcal_date_format" id="wdcal_date_format" size="1">';
        $classes = wdcal_local::getInstanceClasses();
        foreach ($classes as $c) {
                $o .= '<option value="' . $c::getID() . '" ';
@@ -436,13 +439,13 @@ function wdcal_getSettingsPage(&$a)
        }
        $o .= '</select><br>';
 
-       $o .= '<label for="wdcal_time_zone">' . t('Time zone') . ':</label><input id="wdcal_time_zone" value="' . $a->timezone . '" disabled><br>';
+       $o .= '<label for="wdcal_time_zone">' . L10n::t('Time zone') . ':</label><input id="wdcal_time_zone" value="' . $a->timezone . '" disabled><br>';
 
-       $o .= '<input type="submit" name="save" value="' . t('Save') . '">';
+       $o .= '<input type="submit" name="save" value="' . L10n::t('Save') . '">';
        $o .= '</form>';
 
 
-       $o .= '<br><br><h3>' . t('Calendars') . '</h3>';
+       $o .= '<br><br><h3>' . L10n::t('Calendars') . '</h3>';
        $o .= '<form method="POST" action="' . $a->get_baseurl() . '/dav/settings/">';
        $o .= "<input type='hidden' name='form_security_token' value='" . get_form_security_token('calprop') . "'>\n";
        $o .= "<table><tr><th>Type</th><th>Color</th><th>Name</th><th>URI (for CalDAV)</th><th>ICS</th></tr>";
@@ -484,8 +487,8 @@ function wdcal_getSettingsPage(&$a)
        $o .= "</tr>\n";
 
        $o .= "</table>";
-       $o .= "<div style='text-align: center;'>[<a href='#' class='calendar_add_caller'>" . t("Create a new calendar") . "</a>]</div>";
-       $o .= '<input type="submit" name="save_cals" value="' . t('Save') . '">';
+       $o .= "<div style='text-align: center;'>[<a href='#' class='calendar_add_caller'>" . L10n::t("Create a new calendar") . "</a>]</div>";
+       $o .= '<input type="submit" name="save_cals" value="' . L10n::t('Save') . '">';
        $o .= '</form>';
        $baseurl = $a->get_baseurl();
        $o .= "<script>\$(function() {
@@ -493,22 +496,22 @@ function wdcal_getSettingsPage(&$a)
        });</script>";
 
 
-       $o .= "<br><h3>" . t("Limitations") . "</h3>";
+       $o .= "<br><h3>" . L10n::t("Limitations") . "</h3>";
 
        $o .= "- The native friendica events are embedded as read-only, half-transparent in the calendar.<br>";
 
-       $o .= "<br><h3>" . t("Warning") . "</h3>";
+       $o .= "<br><h3>" . L10n::t("Warning") . "</h3>";
 
-       $o .= "This plugin still is in a very early stage of development. Expect major bugs!<br>";
+       $o .= "This addon still is in a very early stage of development. Expect major bugs!<br>";
 
-       $o .= "<br><h3>" . t("Synchronization (iPhone, Thunderbird Lightning, Android, ...)") . "</h3>";
+       $o .= "<br><h3>" . L10n::t("Synchronization (iPhone, Thunderbird Lightning, Android, ...)") . "</h3>";
 
-       $o .= 'This plugin enables synchronization of your dates and contacts with CalDAV- and CardDAV-enabled programs or devices.<br>
+       $o .= 'This addon enables synchronization of your dates and contacts with CalDAV- and CardDAV-enabled programs or devices.<br>
                As an example, the instructions how to set up two-way synchronization with an iPhone/iPodTouch are provided below.<br>
                Unfortunately, Android does not have native support for CalDAV or CardDAV, so an app has to be installed.<br>
-               On desktops, the Lightning-extension to Mozilla Thunderbird should be able to use this plugin as a backend.<br><br>';
+               On desktops, the Lightning-extension to Mozilla Thunderbird should be able to use this addon as a backend.<br><br>';
 
-       $o .= '<h4>' . t('Synchronizing this calendar with the iPhone') . '</h4>';
+       $o .= '<h4>' . L10n::t('Synchronizing this calendar with the iPhone') . '</h4>';
 
        $o .= "<ul>
        <li>Go to the settings</li>
@@ -519,7 +522,7 @@ function wdcal_getSettingsPage(&$a)
        <li><b>Server:</b> " . $a->get_baseurl() . "/dav/ / <b>Username/Password:</b> <em>the same as your friendica-login</em></li>
        </ul>";
 
-       $o .= '<h4>' . t('Synchronizing your Friendica-Contacts with the iPhone') . '</h4>';
+       $o .= '<h4>' . L10n::t('Synchronizing your Friendica-Contacts with the iPhone') . '</h4>';
 
        $o .= "<ul>
        <li>Go to the settings</li>
index 05f6f71406164b5fcf22764e2352980605e4cebb..0974696c502d8828e0333f70a6c70eb4f2c9f6c3 100644 (file)
@@ -1,22 +1,27 @@
 <?php
 
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Module\Login;
+use Friendica\Util\Emailer;
+
 require_once('include/security.php');
 
 function dav_install()
 {
-       register_hook('event_created', 'addon/dav/dav.php', 'dav_event_created_hook');
-       register_hook('event_updated', 'addon/dav/dav.php', 'dav_event_updated_hook');
-       register_hook('profile_tabs', 'addon/dav/dav.php', 'dav_profile_tabs_hook');
-       register_hook('cron', 'addon/dav/dav.php', 'dav_cron');
+       Addon::registerHook('event_created', 'addon/dav/dav.php', 'dav_event_created_hook');
+       Addon::registerHook('event_updated', 'addon/dav/dav.php', 'dav_event_updated_hook');
+       Addon::registerHook('profile_tabs', 'addon/dav/dav.php', 'dav_profile_tabs_hook');
+       Addon::registerHook('cron', 'addon/dav/dav.php', 'dav_cron');
 }
 
 
 function dav_uninstall()
 {
-       unregister_hook('event_created', 'addon/dav/dav.php', 'dav_event_created_hook');
-       unregister_hook('event_updated', 'addon/dav/dav.php', 'dav_event_updated_hook');
-       unregister_hook('profile_tabs', 'addon/dav/dav.php', 'dav_profile_tabs_hook');
-       unregister_hook('cron', 'addon/dav/dav.php', 'dav_cron');
+       Addon::unregisterHook('event_created', 'addon/dav/dav.php', 'dav_event_created_hook');
+       Addon::unregisterHook('event_updated', 'addon/dav/dav.php', 'dav_event_updated_hook');
+       Addon::unregisterHook('profile_tabs', 'addon/dav/dav.php', 'dav_profile_tabs_hook');
+       Addon::unregisterHook('cron', 'addon/dav/dav.php', 'dav_cron');
 }
 
 
@@ -199,7 +204,7 @@ function dav_content()
                        }
                }
        } catch (DAVVersionMismatchException $e) {
-               $x = t("The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this.");
+               $x = L10n::t("The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this.");
        }
        return $x;
 }
@@ -235,12 +240,12 @@ function dav_event_updated_hook(&$a, &$b)
  */
 function dav_profile_tabs_hook(&$a, &$b)
 {
-       $b["tabs"][] = array(
-               "label" => t('Calendar'),
+       $b["tabs"][] = [
+               "label" => L10n::t('Calendar'),
                "url"   => $a->get_baseurl() . "/dav/wdcal/",
                "sel"   => "",
-               "title" => t('Extended calendar with CalDAV-support'),
-       );
+               "title" => L10n::t('Extended calendar with CalDAV-support'),
+       ];
 }
 
 
@@ -277,10 +282,10 @@ function dav_cron(&$a, &$b)
                                        $text_html = str_replace($find, $repl, "Hi %to%!<br>\n<br>\nThe event \"%event%\" is about to begin:<br>\n<a href='" . "%url%" . "'>%url%</a>");
                                        $params    = array(
                                                'fromName'             => FRIENDICA_PLATFORM,
-                                               'fromEmail'            => t('noreply') . '@' . $a->get_hostname(),
-                                               'replyTo'              => t('noreply') . '@' . $a->get_hostname(),
+                                               'fromEmail'            => L10n::t('noreply') . '@' . $a->get_hostname(),
+                                               'replyTo'              => L10n::t('noreply') . '@' . $a->get_hostname(),
                                                'toEmail'              => $user["email"],
-                                               'messageSubject'       => t("Notification: " . $event[0]["Summary"]),
+                                               'messageSubject'       => L10n::t("Notification: " . $event[0]["Summary"]),
                                                'htmlVersion'          => $text_html,
                                                'textVersion'          => $text_text,
                                                'additionalMailHeader' => "",
@@ -299,24 +304,24 @@ function dav_cron(&$a, &$b)
  * @param App $a
  * @param null|object $o
  */
-function dav_plugin_admin_post(&$a = null, &$o = null)
+function dav_addon_admin_post(&$a = null, &$o = null)
 {
-       check_form_security_token_redirectOnErr('/admin/plugins/dav', 'dav_admin_save');
+       check_form_security_token_redirectOnErr('/admin/addons/dav', 'dav_admin_save');
 
        dav_include_files();
        require_once(__DIR__ . "/database-init.inc.php");
 
        if (isset($_REQUEST["install"])) {
                $errs = dav_create_tables();
-               if (count($errs) == 0) info(t('The database tables have been installed.') . EOL);
-               else notice(t("An error occurred during the installation.") . EOL);
+               if (count($errs) == 0) info(L10n::t('The database tables have been installed.') . EOL);
+               else notice(L10n::t("An error occurred during the installation.") . EOL);
        }
        if (isset($_REQUEST["upgrade"])) {
                $errs = dav_upgrade_tables();
                if (count($errs) == 0) {
                        renderAllCalDavEntries();
-                       info(t('The database tables have been updated.') . EOL);
-               } else notice(t("An error occurred during the update.") . EOL);
+                       info(L10n::t('The database tables have been updated.') . EOL);
+               } else notice(L10n::t("An error occurred during the update.") . EOL);
        }
 }
 
@@ -324,7 +329,7 @@ function dav_plugin_admin_post(&$a = null, &$o = null)
  * @param App $a
  * @param string $o
  */
-function dav_plugin_admin(&$a, &$o)
+function dav_addon_admin(&$a, &$o)
 {
        dav_include_files();
        require_once(__DIR__ . "/database-init.inc.php");
@@ -332,31 +337,31 @@ function dav_plugin_admin(&$a, &$o)
        $dbstatus = dav_check_tables();
 
        $o = '<input type="hidden" name="form_security_token" value="' . get_form_security_token("dav_admin_save") . '">';
-       $o .= '<i>' . t("No system-wide settings yet.") . '</i><br><br>';
+       $o .= '<i>' . L10n::t("No system-wide settings yet.") . '</i><br><br>';
 
 
-       $o .= '<h3>' . t('Database status') . '</h3>';
+       $o .= '<h3>' . L10n::t('Database status') . '</h3>';
        switch ($dbstatus) {
                case 0:
-                       $o .= t('Installed');
+                       $o .= L10n::t('Installed');
                        break;
                case 1:
                case 2:
-                       $o .= "<strong>" . t('Upgrade needed') . "</strong><br>" . t("Please back up all calendar data (the tables beginning with dav_*) before proceeding. While all calendar events <i>should</i> be converted to the new database structure, it's always safe to have a backup. Below, you can have a look at the database-queries that will be made when pressing the 'update'-button.") . "<br><br><input type='submit' name='upgrade' value='" . t('Upgrade') . "'>";
+                       $o .= "<strong>" . L10n::t('Upgrade needed') . "</strong><br>" . L10n::t("Please back up all calendar data (the tables beginning with dav_*) before proceeding. While all calendar events <i>should</i> be converted to the new database structure, it's always safe to have a backup. Below, you can have a look at the database-queries that will be made when pressing the 'update'-button.") . "<br><br><input type='submit' name='upgrade' value='" . L10n::t('Upgrade') . "'>";
                        break;
                case -1:
-                       $o .= t('Not installed') . "<br><br><input type='submit' name='install' value='" . t('Install') . "'>";
+                       $o .= L10n::t('Not installed') . "<br><br><input type='submit' name='install' value='" . L10n::t('Install') . "'>";
                        break;
                case -2:
                default:
-                       $o .= t('Unknown') . "<br><br>" . t("Something really went wrong. I cannot recover from this state automatically, sorry. Please go to the database backend, back up the data, and delete all tables beginning with 'dav_' manually. Afterwards, this installation routine should be able to reinitialize the tables automatically.");
+                       $o .= L10n::t('Unknown') . "<br><br>" . L10n::t("Something really went wrong. I cannot recover from this state automatically, sorry. Please go to the database backend, back up the data, and delete all tables beginning with 'dav_' manually. Afterwards, this installation routine should be able to reinitialize the tables automatically.");
                        break;
        }
        $o .= "<br><br>";
 
-       $o .= "<h3>" . t("Troubleshooting") . "</h3>";
-       $o .= "<h4>" . t("Manual creation of the database tables:") . "</h4>";
-       $o .= "<a href='#' onClick='\$(\"#sqlstatements\").show(); return false;'>" . t("Show SQL-statements") . "</a><blockquote style='display: none;' id='sqlstatements'><pre>";
+       $o .= "<h3>" . L10n::t("Troubleshooting") . "</h3>";
+       $o .= "<h4>" . L10n::t("Manual creation of the database tables:") . "</h4>";
+       $o .= "<a href='#' onClick='\$(\"#sqlstatements\").show(); return false;'>" . L10n::t("Show SQL-statements") . "</a><blockquote style='display: none;' id='sqlstatements'><pre>";
        switch ($dbstatus) {
                case 1: case 2:
                        $tables = dav_get_update_statements($dbstatus);
index ac2d516aa931d436334f0b5e3571c88b8bb297eb..c7726531ac9ceda2f91600ff3431b3c4e7d86da8 100644 (file)
@@ -1,4 +1,4 @@
-/* German initialisation for the jQuery UI date picker plugin. */
+/* German initialisation for the jQuery UI date picker addon. */
 /* Written by Milian Wolff (mail@milianw.de). */
 jQuery(function($){
        $.datepicker.regional['de'] = {
index 7913b53a643adfc762ebfe9b06ab9bd160c523e3..0f2fc5c752973a64bba5292d0a5ae08537dcae17 100644 (file)
@@ -183,7 +183,7 @@ msgstr ""
 
 #: friendica/main.php:202
 msgid ""
-"The current version of this plugin has not been set up correctly. Please "
+"The current version of this addon has not been set up correctly. Please "
 "contact the system administrator of your installation of friendica to fix "
 "this."
 msgstr ""
index f198cd895a73038f90393d16fe6b56cd5f4de50a..93816d2a94717856fe8e666c29b298442a272e27 100644 (file)
@@ -40,7 +40,7 @@ $a->strings["Warning"] = "Avís";
 $a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Syncronització (iPhone, Thunderbird Lightning, Android, ...)";\r
 $a->strings["Synchronizing this calendar with the iPhone"] = "Sncronitzant aquest calendari amb el iPhone";\r
 $a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Sincronitzant els teus contactes a Friendica amb el iPhone";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
 $a->strings["Calendar"] = "Calendari";\r
 $a->strings["Extended calendar with CalDAV-support"] = "Calendari ampliat amb suport CalDAV";\r
 $a->strings["noreply"] = "no contestar";\r
index d55ac2e06038da3c60d34635472abd1c6e3f491a..561206a47e6e4abde8a716a1492997cff4ead6aa 100644 (file)
@@ -185,7 +185,7 @@ msgstr "Synchronizovat Vaše Friendica kontakty s iPhone"
 
 #: friendica/main.php:202
 msgid ""
-"The current version of this plugin has not been set up correctly. Please "
+"The current version of this addon has not been set up correctly. Please "
 "contact the system administrator of your installation of friendica to fix "
 "this."
 msgstr "Stávající verze tohoto rozšíření nebyla správně nastavena. Prosím, kontaktujte administrátora webu, ať to opraví."
index a42a3a3078b69bc6a6527fce6b1013bb6cebdf75..0c5066f510f1cf98ceca365b29402a15ba863b1b 100644 (file)
@@ -45,7 +45,7 @@ $a->strings["Warning"] = "Omezení";
 $a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Synchronizace (iPhone, Thunderbird Lightning, Android, ...)";
 $a->strings["Synchronizing this calendar with the iPhone"] = "Synchronizovat tento kalendář s iPhone";
 $a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Synchronizovat Vaše Friendica kontakty s iPhone";
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "Stávající verze tohoto rozšíření nebyla správně nastavena. Prosím, kontaktujte administrátora webu, ať to opraví.";
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "Stávající verze tohoto rozšíření nebyla správně nastavena. Prosím, kontaktujte administrátora webu, ať to opraví.";
 $a->strings["Calendar"] = "Kalendář";
 $a->strings["Extended calendar with CalDAV-support"] = "Rozšířený kalendář s podporou CalDAV";
 $a->strings["noreply"] = "bez odpovědi";
index 9eeb56d66d2b7f0374a770f84e830dad695ba469..3f816fb31613b848756b07085d9b96da99055c40 100644 (file)
@@ -185,7 +185,7 @@ msgstr "Friendica-Kontakte mit dem iPhone synchronisieren"
 
 #: friendica/main.php:202
 msgid ""
-"The current version of this plugin has not been set up correctly. Please "
+"The current version of this addon has not been set up correctly. Please "
 "contact the system administrator of your installation of friendica to fix "
 "this."
 msgstr "Die aktuelle Version dieses Plugins wurde nicht korrekt eingestellt. Bitte kontaktiere den System-Administrator deiner Friendica Installation um den Fehler zu beheben."
index 441a1dacba37881c79dc4d1e8b651ea7ae7a7893..2a938464a9ead43651e00d57bb3bd6c3bb4df1e3 100644 (file)
@@ -45,7 +45,7 @@ $a->strings["Warning"] = "Warnung";
 $a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Synchronisation (iPhone, Thunderbird Lightning, Android, ...)";
 $a->strings["Synchronizing this calendar with the iPhone"] = "Diesen Kalender mit dem iPhone synchronisieren";
 $a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Friendica-Kontakte mit dem iPhone synchronisieren";
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "Die aktuelle Version dieses Plugins wurde nicht korrekt eingestellt. Bitte kontaktiere den System-Administrator deiner Friendica Installation um den Fehler zu beheben.";
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "Die aktuelle Version dieses Plugins wurde nicht korrekt eingestellt. Bitte kontaktiere den System-Administrator deiner Friendica Installation um den Fehler zu beheben.";
 $a->strings["Calendar"] = "Kalender";
 $a->strings["Extended calendar with CalDAV-support"] = "Erweiterter Kalender mit CalDAV Unterstützung.";
 $a->strings["noreply"] = "noreply";
index 6e902d5b5a2afa6fd20645d8781ada23914e3689..5ecd486b04729c971dff8525f5de9b13875379fd 100644 (file)
@@ -40,7 +40,7 @@ $a->strings["Warning"] = "Averto";
 $a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Sinkronigo (iPhone, Thunderbird Lightning, Android, ...)";\r
 $a->strings["Synchronizing this calendar with the iPhone"] = "Sinkronigi tiun kalendaron kun la iPhone";\r
 $a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Sinkronigi viajn Friendica kontaktojn kun la iPhone";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
 $a->strings["Calendar"] = "Kalendaro";\r
 $a->strings["Extended calendar with CalDAV-support"] = "Etendita kalendaro kun CalDAV subteno";\r
 $a->strings["noreply"] = "nerespondi";\r
index d00bbe2601fd6a0dea054f422979093d422b527c..7bc95e0bff52293c2b1b50fc80cf1ad16eb756de 100644 (file)
@@ -186,10 +186,10 @@ msgstr "Sincronizar sus contactos de Friendica con el iPhone"
 
 #: friendica/main.php:202
 msgid ""
-"The current version of this plugin has not been set up correctly. Please "
+"The current version of this addon has not been set up correctly. Please "
 "contact the system administrator of your installation of friendica to fix "
 "this."
-msgstr "La versión actual de este plugin no se ha instalado correctamente. Por favor contacte con el administrador del sistema de su instalación de Friendica para resolver esto."
+msgstr "La versión actual de este addon no se ha instalado correctamente. Por favor contacte con el administrador del sistema de su instalación de Friendica para resolver esto."
 
 #: friendica/main.php:239 common/wdcal_edit.inc.php:146
 msgid "Calendar"
index 5300246abea79bccd42f90559318bd27d5dd9f05..76a3ad2e6eb3d66439b5641062f4857b85fc4680 100644 (file)
@@ -45,7 +45,7 @@ $a->strings["Warning"] = "Advertencia";
 $a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Sincronización (iPhone, Thunderbird Lightning, Android, ...)";
 $a->strings["Synchronizing this calendar with the iPhone"] = "Sincronizar este calendario con el iPhone";
 $a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Sincronizar sus contactos de Friendica con el iPhone";
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "La versión actual de este plugin no se ha instalado correctamente. Por favor contacte con el administrador del sistema de su instalación de Friendica para resolver esto.";
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "La versión actual de este addon no se ha instalado correctamente. Por favor contacte con el administrador del sistema de su instalación de Friendica para resolver esto.";
 $a->strings["Calendar"] = "Calendario";
 $a->strings["Extended calendar with CalDAV-support"] = "Estendido el calendario con soporte CalDAV";
 $a->strings["noreply"] = "no responder";
index 86dae0d11d138614b96aeda28b02456f25fe9704..0705d6a3765a943bb60c9031270df7671b71f663 100644 (file)
@@ -40,7 +40,7 @@ $a->strings["Warning"] = "Avertissement";
 $a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Synchronisation (Iphone, Thunderbird Lightning, Android, ...)";\r
 $a->strings["Synchronizing this calendar with the iPhone"] = "Synchronisation avec l'Iphone en cours";\r
 $a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Synchronisation de vos contacts Friendica avec l'Iphone en cours";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "La version actuelle de cette extension n'a pas été configurée correctement. Merci de contacter votre administrateur Friendica pour régler ce problème. ";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "La version actuelle de cette extension n'a pas été configurée correctement. Merci de contacter votre administrateur Friendica pour régler ce problème. ";\r
 $a->strings["Calendar"] = "Calendrier";\r
 $a->strings["Extended calendar with CalDAV-support"] = "Calendrier étendu avec support CalDAV";\r
 $a->strings["noreply"] = "noreply";\r
index e592e7de0fa2ca3dea9f7b6e14f9fcb5853a84ac..69fc6178c7825ff118b8e6995430fbffafbd47a2 100644 (file)
@@ -40,7 +40,7 @@ $a->strings["Warning"] = "";
 $a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "";\r
 $a->strings["Synchronizing this calendar with the iPhone"] = "";\r
 $a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
 $a->strings["Calendar"] = "";\r
 $a->strings["Extended calendar with CalDAV-support"] = "";\r
 $a->strings["noreply"] = "ekki svara";\r
index ae53f06eb37a3c964eccbeca59d9d7fedc1223bf..1470b8c0336d46a56a93bc0cccf16cf659804ddd 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-12-14 11:10+0000\n"
+"PO-Revision-Date: 2018-03-19 13:21+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -185,10 +185,10 @@ msgstr "Sincronizzare i tuoi contatti di Friendica con l'iPhone"
 
 #: friendica/main.php:202
 msgid ""
-"The current version of this plugin has not been set up correctly. Please "
+"The current version of this addon has not been set up correctly. Please "
 "contact the system administrator of your installation of friendica to fix "
 "this."
-msgstr "La versione corrente di questo plugin non è stata configurata correttamente. Contatta l'amministratore."
+msgstr "La versione corrente di questo componente aggiuntivo non è stata configurata correttamente. Contatta l'amministratore."
 
 #: friendica/main.php:239 common/wdcal_edit.inc.php:146
 msgid "Calendar"
index 9fe374ccecf74e62a0b666a9ea160e30f89e4e2c..712e2040dcd6e9e9295305154b63c3a28268be8a 100644 (file)
@@ -45,7 +45,7 @@ $a->strings["Warning"] = "Attenzione";
 $a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Sincronizzazione (iPhone, Thunderbird Lightning, Android, ...)";
 $a->strings["Synchronizing this calendar with the iPhone"] = "Sincronizzare questo calendario con l'iPhone";
 $a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Sincronizzare i tuoi contatti di Friendica con l'iPhone";
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "La versione corrente di questo plugin non è stata configurata correttamente. Contatta l'amministratore.";
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "La versione corrente di questo componente aggiuntivo non è stata configurata correttamente. Contatta l'amministratore.";
 $a->strings["Calendar"] = "Calendario";
 $a->strings["Extended calendar with CalDAV-support"] = "Calendario esteso con supporto CalDAV";
 $a->strings["noreply"] = "nonrispondere";
index 3ba89070fdc9832591df0a4c7a4e8aac084adb7e..132f0750480724363e5b9a0c1eb5898d4b0dbb28 100644 (file)
@@ -40,7 +40,7 @@ $a->strings["Warning"] = "";
 $a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "";\r
 $a->strings["Synchronizing this calendar with the iPhone"] = "";\r
 $a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
 $a->strings["Calendar"] = "";\r
 $a->strings["Extended calendar with CalDAV-support"] = "";\r
 $a->strings["noreply"] = "ikke svar";\r
index 171a73e1a51db2125a8bffb1fb9fd76efc2bfd99..9fcae4b8df6cc500b867bb3b98f70352962072e8 100644 (file)
@@ -40,7 +40,7 @@ $a->strings["Warning"] = "Ostrzeżenie";
 $a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Synchronizacja (iPhone, Thunderbird Lightning, Android, ...)";\r
 $a->strings["Synchronizing this calendar with the iPhone"] = "Zsynchronizuj kalendarz z iPhone";\r
 $a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Zsynchronizuj kontakty friendica z iPhone";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
 $a->strings["Calendar"] = "Kalendarz";\r
 $a->strings["Extended calendar with CalDAV-support"] = "";\r
 $a->strings["noreply"] = "brak odpowiedzi";\r
index 566c3a84a8f78d03353d9ddab8ab5af79d9645e6..d57df030d4672b3eabf2dc8a5d50b08367432e41 100644 (file)
@@ -40,7 +40,7 @@ $a->strings["Warning"] = "Aviso";
 $a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Sincronização (iPhone, Thunderbird Lightning, Android, ...)";\r
 $a->strings["Synchronizing this calendar with the iPhone"] = "Sincronização desta agenda com o iPhone";\r
 $a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Sincronização dos seus contatos Friendica com o iPhone";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
 $a->strings["Calendar"] = "Agenda";\r
 $a->strings["Extended calendar with CalDAV-support"] = "";\r
 $a->strings["noreply"] = "naoresponda";\r
index c6925954eff3cd381eb86c9a02492726fefb91b5..ec8cdc19d8e0bd62a391f348530c55352d52449b 100644 (file)
@@ -184,7 +184,7 @@ msgstr "Sincronizați contactele Friendica cu iPhone"
 
 #: friendica/main.php:202
 msgid ""
-"The current version of this plugin has not been set up correctly. Please "
+"The current version of this addon has not been set up correctly. Please "
 "contact the system administrator of your installation of friendica to fix "
 "this."
 msgstr "Versiunea curentă a acestui modul nu a fost corect configurată. Vă rugăm să contactați administratorul de sistem al aplicației dvs. friendica, pentru a corecta această situație."
index f2870213e53f6b55df9b6678fc347bec2ea2bab9..cf3ff44962062ce88c9460681880c366efb109e6 100644 (file)
@@ -45,7 +45,7 @@ $a->strings["Warning"] = "Atenție";
 $a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Sincronizare (iPhone, Thunderbird Lightning, Android, ...)";
 $a->strings["Synchronizing this calendar with the iPhone"] = "Sincronizați acest calendar cu iPhone";
 $a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Sincronizați contactele Friendica cu iPhone";
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "Versiunea curentă a acestui modul nu a fost corect configurată. Vă rugăm să contactați administratorul de sistem al aplicației dvs. friendica, pentru a corecta această situație.";
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "Versiunea curentă a acestui modul nu a fost corect configurată. Vă rugăm să contactați administratorul de sistem al aplicației dvs. friendica, pentru a corecta această situație.";
 $a->strings["Calendar"] = "Calendar";
 $a->strings["Extended calendar with CalDAV-support"] = "Calendar extins cu suport-CalDAV";
 $a->strings["noreply"] = "nu-răspunde";
index 32921b3b7974a0f8c4d0f93ff1bc76ca1d369ed5..7e4a4fb25c71d5f415705ea6b1a019216e94ad5c 100644 (file)
@@ -40,7 +40,7 @@ $a->strings["Warning"] = "";
 $a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "";\r
 $a->strings["Synchronizing this calendar with the iPhone"] = "";\r
 $a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";\r
 $a->strings["Calendar"] = "";\r
 $a->strings["Extended calendar with CalDAV-support"] = "";\r
 $a->strings["noreply"] = "без ответа";\r
index 45de3639b362a12930aa9f785c4570e5cfdc9aa7..7ace01d7d8ae5a6e57820d76648a75118205b880 100644 (file)
@@ -40,7 +40,7 @@ $a->strings["Warning"] = "警告";
 $a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "同步(iPhone,Thunderbird Lightning, 案桌,等)";\r
 $a->strings["Synchronizing this calendar with the iPhone"] = "正在把这个日历跟iPhone同步";\r
 $a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "正在把您的Friendica熟人跟iPhone同步";\r
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "现有的插件没安装好。请跟系统管理您的friendica安装联系为维修。";\r
+$a->strings["The current version of this addon has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "现有的插件没安装好。请跟系统管理您的friendica安装联系为维修。";\r
 $a->strings["Calendar"] = "日历";\r
 $a->strings["Extended calendar with CalDAV-support"] = "增能日历跟CalDAV支持";\r
 $a->strings["noreply"] = "noreply";\r
index f637f468ed8d7a75f0ef518dad13a4a6e8d9b560..8c7a5762069b9e70443d5033ee3404d382f0d033 100644 (file)
@@ -7,23 +7,29 @@
  * Author: Michael Vogel <heluecht@pirati.ca>
  */
 
-require_once("addon/diaspora/Diaspora_Connection.php");
+require_once 'addon/diaspora/Diaspora_Connection.php';
+
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Database\DBM;
+use Friendica\Model\Queue;
 
 function diaspora_install() {
-       register_hook('post_local',           'addon/diaspora/diaspora.php', 'diaspora_post_local');
-       register_hook('notifier_normal',      'addon/diaspora/diaspora.php', 'diaspora_send');
-       register_hook('jot_networks',         'addon/diaspora/diaspora.php', 'diaspora_jot_nets');
-       register_hook('connector_settings',      'addon/diaspora/diaspora.php', 'diaspora_settings');
-       register_hook('connector_settings_post', 'addon/diaspora/diaspora.php', 'diaspora_settings_post');
-       register_hook('queue_predeliver', 'addon/diaspora/diaspora.php', 'diaspora_queue_hook');
+       Addon::registerHook('post_local',           'addon/diaspora/diaspora.php', 'diaspora_post_local');
+       Addon::registerHook('notifier_normal',      'addon/diaspora/diaspora.php', 'diaspora_send');
+       Addon::registerHook('jot_networks',         'addon/diaspora/diaspora.php', 'diaspora_jot_nets');
+       Addon::registerHook('connector_settings',      'addon/diaspora/diaspora.php', 'diaspora_settings');
+       Addon::registerHook('connector_settings_post', 'addon/diaspora/diaspora.php', 'diaspora_settings_post');
+       Addon::registerHook('queue_predeliver', 'addon/diaspora/diaspora.php', 'diaspora_queue_hook');
 }
 function diaspora_uninstall() {
-       unregister_hook('post_local',       'addon/diaspora/diaspora.php', 'diaspora_post_local');
-       unregister_hook('notifier_normal',  'addon/diaspora/diaspora.php', 'diaspora_send');
-       unregister_hook('jot_networks',     'addon/diaspora/diaspora.php', 'diaspora_jot_nets');
-       unregister_hook('connector_settings',      'addon/diaspora/diaspora.php', 'diaspora_settings');
-       unregister_hook('connector_settings_post', 'addon/diaspora/diaspora.php', 'diaspora_settings_post');
-       unregister_hook('queue_predeliver', 'addon/diaspora/diaspora.php', 'diaspora_queue_hook');
+       Addon::unregisterHook('post_local',       'addon/diaspora/diaspora.php', 'diaspora_post_local');
+       Addon::unregisterHook('notifier_normal',  'addon/diaspora/diaspora.php', 'diaspora_send');
+       Addon::unregisterHook('jot_networks',     'addon/diaspora/diaspora.php', 'diaspora_jot_nets');
+       Addon::unregisterHook('connector_settings',      'addon/diaspora/diaspora.php', 'diaspora_settings');
+       Addon::unregisterHook('connector_settings_post', 'addon/diaspora/diaspora.php', 'diaspora_settings_post');
+       Addon::unregisterHook('queue_predeliver', 'addon/diaspora/diaspora.php', 'diaspora_queue_hook');
 }
 
 
@@ -36,7 +42,7 @@ function diaspora_jot_nets(&$a,&$b) {
         $diaspora_defpost = get_pconfig(local_user(),'diaspora','post_by_default');
         $selected = ((intval($diaspora_defpost) == 1) ? ' checked="checked" ' : '');
         $b .= '<div class="profile-jot-net"><input type="checkbox" name="diaspora_enable"' . $selected . ' value="1" /> '
-            . t('Post to Diaspora') . '</div>';
+            . L10n::t('Post to Diaspora') . '</div>';
     }
 }
 
@@ -49,8 +55,6 @@ function diaspora_queue_hook(&$a,&$b) {
        if(! count($qi))
                return;
 
-       require_once('include/queue_fn.php');
-
        foreach($qi as $x) {
                if($x['network'] !== NETWORK_DIASPORA2)
                        continue;
@@ -90,20 +94,21 @@ function diaspora_queue_hook(&$a,&$b) {
                                $conn->provider = $hostname;
                                $conn->postStatusMessage($post, $aspect);
 
-                                logger('diaspora_queue: send '.$userdata['uid'].' success', LOGGER_DEBUG);
+                               logger('diaspora_queue: send '.$userdata['uid'].' success', LOGGER_DEBUG);
 
-                                $success = true;
+                               $success = true;
 
-                                remove_queue_item($x['id']);
+                               Queue::removeItem($x['id']);
                        } catch (Exception $e) {
                                logger("diaspora_queue: Send ".$userdata['uid']." failed: ".$e->getMessage(), LOGGER_DEBUG);
                        }
-               } else
+               } else {
                        logger('diaspora_queue: send '.$userdata['uid'].' missing username or password', LOGGER_DEBUG);
+               }
 
                if (!$success) {
                        logger('diaspora_queue: delayed');
-                       update_queue_time($x['id']);
+                       Queue::updateTime($x['id']);
                }
        }
 }
@@ -134,10 +139,10 @@ function diaspora_settings(&$a,&$s) {
        $status = "";
 
        $r = q("SELECT `addr` FROM `contact` WHERE `self` AND `uid` = %d", intval(local_user()));
-       if (dbm::is_result($r)) {
-               $status = sprintf(t("Please remember: You can always be reached from Diaspora with your Friendica handle %s. "), $r[0]['addr']);
-               $status .= t('This connector is only meant if you still want to use your old Diaspora account for some time. ');
-               $status .= sprintf(t('However, it is preferred that you tell your Diaspora contacts the new handle %s instead.'), $r[0]['addr']);
+       if (DBM::is_result($r)) {
+               $status = L10n::t("Please remember: You can always be reached from Diaspora with your Friendica handle %s. ", $r[0]['addr']);
+               $status .= L10n::t('This connector is only meant if you still want to use your old Diaspora account for some time. ');
+               $status .= L10n::t('However, it is preferred that you tell your Diaspora contacts the new handle %s instead.', $r[0]['addr']);
        }
 
        $aspects = false;
@@ -147,18 +152,18 @@ function diaspora_settings(&$a,&$s) {
                $conn->logIn();
                $aspects = $conn->getAspects();
                if (!$aspects) {
-                       $status = t("Can't login to your Diaspora account. Please check handle (in the format user@domain.tld) and password.");
+                       $status = L10n::t("Can't login to your Diaspora account. Please check handle (in the format user@domain.tld) and password.");
                }
        }
 
        /* Add some HTML to the existing form */
 
        $s .= '<span id="settings_diaspora_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_diaspora_expanded\'); openClose(\'settings_diaspora_inflated\');">';
-       $s .= '<img class="connector'.$css.'" src="images/diaspora-logo.png" /><h3 class="connector">'. t('Diaspora Export').'</h3>';
+       $s .= '<img class="connector'.$css.'" src="images/diaspora-logo.png" /><h3 class="connector">'. L10n::t('Diaspora Export').'</h3>';
        $s .= '</span>';
        $s .= '<div id="settings_diaspora_expanded" class="settings-block" style="display: none;">';
        $s .= '<span class="fakelink" onclick="openClose(\'settings_diaspora_expanded\'); openClose(\'settings_diaspora_inflated\');">';
-       $s .= '<img class="connector'.$css.'" src="images/diaspora-logo.png" /><h3 class="connector">'. t('Diaspora Export').'</h3>';
+       $s .= '<img class="connector'.$css.'" src="images/diaspora-logo.png" /><h3 class="connector">'. L10n::t('Diaspora Export').'</h3>';
        $s .= '</span>';
 
        if ($status) {
@@ -168,32 +173,32 @@ function diaspora_settings(&$a,&$s) {
        }
 
        $s .= '<div id="diaspora-enable-wrapper">';
-       $s .= '<label id="diaspora-enable-label" for="diaspora-checkbox">' . t('Enable Diaspora Post Plugin') . '</label>';
+       $s .= '<label id="diaspora-enable-label" for="diaspora-checkbox">' . L10n::t('Enable Diaspora Post Addon') . '</label>';
        $s .= '<input id="diaspora-checkbox" type="checkbox" name="diaspora" value="1" ' . $checked . '/>';
        $s .= '</div><div class="clear"></div>';
 
        $s .= '<div id="diaspora-username-wrapper">';
-       $s .= '<label id="diaspora-username-label" for="diaspora-username">' . t('Diaspora handle') . '</label>';
+       $s .= '<label id="diaspora-username-label" for="diaspora-username">' . L10n::t('Diaspora handle') . '</label>';
        $s .= '<input id="diaspora-username" type="text" name="handle" value="' . $handle . '" />';
        $s .= '</div><div class="clear"></div>';
 
        $s .= '<div id="diaspora-password-wrapper">';
-       $s .= '<label id="diaspora-password-label" for="diaspora-password">' . t('Diaspora password') . '</label>';
+       $s .= '<label id="diaspora-password-label" for="diaspora-password">' . L10n::t('Diaspora password') . '</label>';
        $s .= '<input id="diaspora-password" type="password" name="password" value="' . $password . '" />';
        $s .= '</div><div class="clear"></div>';
 
        if ($aspects) {
                $single_aspect =  new stdClass();
                $single_aspect->id = 'all_aspects';
-               $single_aspect->name = t('All aspects');
+               $single_aspect->name = L10n::t('All aspects');
                $aspects[] = $single_aspect;
 
                $single_aspect =  new stdClass();
                $single_aspect->id = 'public';
-               $single_aspect->name = t('Public');
+               $single_aspect->name = L10n::t('Public');
                $aspects[] = $single_aspect;
 
-               $s .= '<label id="diaspora-aspect-label" for="diaspora-aspect">' . t('Post to aspect:') . '</label>';
+               $s .= '<label id="diaspora-aspect-label" for="diaspora-aspect">' . L10n::t('Post to aspect:') . '</label>';
                $s .= '<select name="aspect" id="diaspora-aspect">';
                foreach($aspects as $single_aspect) {
                        if ($single_aspect->id == $aspect)
@@ -207,13 +212,13 @@ function diaspora_settings(&$a,&$s) {
        }
 
        $s .= '<div id="diaspora-bydefault-wrapper">';
-       $s .= '<label id="diaspora-bydefault-label" for="diaspora-bydefault">' . t('Post to Diaspora by default') . '</label>';
+       $s .= '<label id="diaspora-bydefault-label" for="diaspora-bydefault">' . L10n::t('Post to Diaspora by default') . '</label>';
        $s .= '<input id="diaspora-bydefault" type="checkbox" name="diaspora_bydefault" value="1" ' . $def_checked . '/>';
        $s .= '</div><div class="clear"></div>';
 
        /* provide a submit button */
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="diaspora-submit" name="diaspora-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="diaspora-submit" name="diaspora-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
 }
 
@@ -323,7 +328,7 @@ function diaspora_send(&$a,&$b) {
                 } while ($oldbody != $body);
 
                // convert to markdown
-               $body = bb2diaspora($body, false, true);
+               $body = bb2diaspora($body);
 
                // Adding the title
                if(strlen($title))
@@ -351,10 +356,10 @@ function diaspora_send(&$a,&$b) {
                        if (count($r))
                                $a->contact = $r[0]["id"];
 
-                       $s = serialize(array('url' => $url, 'item' => $b['id'], 'post' => $body));
-                       require_once('include/queue_fn.php');
-                       add_to_queue($a->contact,NETWORK_DIASPORA2,$s);
-                       notice(t('Diaspora post failed. Queued for retry.').EOL);
+                       $s = serialize(['url' => $url, 'item' => $b['id'], 'post' => $body]);
+
+                       Queue::add($a->contact, NETWORK_DIASPORA2, $s);
+                       notice(L10n::t('Diaspora post failed. Queued for retry.').EOL);
                }
        }
 }
index 0f71c2cd8e74321e41cc940368c74b3b77f23e16..6764eaf1e939975314bf17f9bc18f307a633d189 100644 (file)
@@ -32,7 +32,7 @@ msgid "Diaspora Export"
 msgstr ""
 
 #: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
+msgid "Enable Diaspora Post Addon"
 msgstr ""
 
 #: diaspora.php:168
index 22e1cfef03dc700815d83a40ce0e2a25a38a9498..5d8b0a309ff2feb0cbf41f0edd93831703b1e798 100644 (file)
@@ -34,8 +34,8 @@ msgid "Diaspora Export"
 msgstr "Diaspora export"
 
 #: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
-msgstr "Povolit Diaspora Plugin"
+msgid "Enable Diaspora Post Addon"
+msgstr "Povolit Diaspora Addon"
 
 #: diaspora.php:168
 msgid "Diaspora username"
index 9db097912864c621452b3249783b9d5a0f118301..1a87dc1f94b74b4c9510aab5325065370272dcf9 100644 (file)
@@ -8,7 +8,7 @@ function string_plural_select_cs($n){
 $a->strings["Post to Diaspora"] = "Příspěvek na Diaspora";
 $a->strings["Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"] = "Nelze se přihlásit na váš Diaspora účet. Prosím ověřte své uživatelské jméno a heslo a ujistěte se, že jste použili kompletní adresu (včetně http...)";
 $a->strings["Diaspora Export"] = "Diaspora export";
-$a->strings["Enable Diaspora Post Plugin"] = "Povolit Diaspora Plugin";
+$a->strings["Enable Diaspora Post Addon"] = "Povolit Diaspora Addon";
 $a->strings["Diaspora username"] = "Diaspora uživatelské jméno";
 $a->strings["Diaspora password"] = "Diaspora heslo";
 $a->strings["Diaspora site URL"] = "Adresa webu Diaspora";
index eaeb24edb7331f0fc050d51b9de6f6e5a3f74770..22187254ac7e31f58fcf33c5b6b7cf2f16647178 100644 (file)
@@ -34,7 +34,7 @@ msgid "Diaspora Export"
 msgstr "Diaspora Export"
 
 #: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
+msgid "Enable Diaspora Post Addon"
 msgstr "Veröffentlichungen bei Diaspora erlauben"
 
 #: diaspora.php:168
index 597d4cea9bda8a6fe448020c98f11a2355c05b83..22990765e80f7b6f18df8ed4918286073a7d91c7 100644 (file)
@@ -8,7 +8,7 @@ function string_plural_select_de($n){
 $a->strings["Post to Diaspora"] = "Auf Diaspora veröffentlichen";
 $a->strings["Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"] = "Anmeldung bei deinem Diaspora Account fehlgeschlagen. Bitte überprüfe Nutzername und Passwort und stelle sicher, dass die komplette Adresse (inklusive des htto...) verwendet wurde.";
 $a->strings["Diaspora Export"] = "Diaspora Export";
-$a->strings["Enable Diaspora Post Plugin"] = "Veröffentlichungen bei Diaspora erlauben";
+$a->strings["Enable Diaspora Post Addon"] = "Veröffentlichungen bei Diaspora erlauben";
 $a->strings["Diaspora username"] = "Diaspora Nutzername";
 $a->strings["Diaspora password"] = "Diaspora Passwort";
 $a->strings["Diaspora site URL"] = "URL der Diaspora Seite";
index 16ce4539074c0883e1c83c9c0c8e274f803ca95c..a7beaa0495ab0575a5a5625c50dd74b7b13b473f 100644 (file)
@@ -34,8 +34,8 @@ msgid "Diaspora Export"
 msgstr "Exportar a Diaspora*"
 
 #: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
-msgstr "Habilitar publicar a traves de Diaspora* plugin."
+msgid "Enable Diaspora Post Addon"
+msgstr "Habilitar publicar a traves de Diaspora* addon."
 
 #: diaspora.php:168
 msgid "Diaspora username"
index b3251898969710c02b30a62c665b74cc96b94fad..e25594c3f11aeac8d06c428e3bdf7831dfa74431 100644 (file)
@@ -8,7 +8,7 @@ function string_plural_select_es($n){
 $a->strings["Post to Diaspora"] = "Publicar hacia Diaspora*";
 $a->strings["Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"] = "No se puede ingresar a tu cuenta de Diaspora*. Por favor verificar nombre de usuario, contraseña y asegura de usar la dirección completa, incluyendo https.. .";
 $a->strings["Diaspora Export"] = "Exportar a Diaspora*";
-$a->strings["Enable Diaspora Post Plugin"] = "Habilitar publicar a traves de Diaspora* plugin.";
+$a->strings["Enable Diaspora Post Addon"] = "Habilitar publicar a traves de Diaspora* addon.";
 $a->strings["Diaspora username"] = "Nombre de usuario de Diaspora*.";
 $a->strings["Diaspora password"] = "Contraseña Diaspora*";
 $a->strings["Diaspora site URL"] = "URL sitio Diaspora*";
index 6f2fa876d63c47b0459c47ac0177e905a3c6a556..d8f79f976f23cdd08ca14792be3925fdb0f9940f 100644 (file)
@@ -35,7 +35,7 @@ msgid "Diaspora Export"
 msgstr "Export Diaspora"
 
 #: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
+msgid "Enable Diaspora Post Addon"
 msgstr "Activer l’extension « Publier sur Diaspora »"
 
 #: diaspora.php:168
index 8ba2940c578923231407d3368f5705b556843614..c9037b6af3a011ff6109800719adf9021012f09f 100644 (file)
@@ -8,7 +8,7 @@ function string_plural_select_fr($n){
 $a->strings["Post to Diaspora"] = "Publier sur Diaspora";
 $a->strings["Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"] = "Impossible de se connecter à votre compte Diaspora. Veuillez vérifier votre identifiant et votre mot de passe, et assurez-vous d’avoir indiqué l’adresse complète (y compris le « http:// » initial).";
 $a->strings["Diaspora Export"] = "Export Diaspora";
-$a->strings["Enable Diaspora Post Plugin"] = "Activer l’extension « Publier sur Diaspora »";
+$a->strings["Enable Diaspora Post Addon"] = "Activer l’extension « Publier sur Diaspora »";
 $a->strings["Diaspora username"] = "Identifiant Diaspora";
 $a->strings["Diaspora password"] = "Mot de passe Diaspora";
 $a->strings["Diaspora site URL"] = "Adresse du site Diaspora";
index 514dcbb1f8b6e9b0410e12d2fb725c81a22c001f..8c3265dc9cd4790d516c8e20ae1e0fe4e9619b98 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-06-22 13:18+0200\n"
-"PO-Revision-Date: 2014-09-10 11:57+0000\n"
+"PO-Revision-Date: 2018-03-19 13:21+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -34,8 +34,8 @@ msgid "Diaspora Export"
 msgstr "Esporta Diaspora"
 
 #: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
-msgstr "Abilita il plugin di invio a Diaspora"
+msgid "Enable Diaspora Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio a Diaspora"
 
 #: diaspora.php:168
 msgid "Diaspora username"
index 4b8affb6a3c6843ae6f10aee7a2dc030e5d99969..a7778c94689e2aeb83a6b102e1f4960b0f4985cb 100644 (file)
@@ -8,7 +8,7 @@ function string_plural_select_it($n){
 $a->strings["Post to Diaspora"] = "Invia a Diaspora";
 $a->strings["Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"] = "Non riesco ad autenticarmi con il tuo account Diaspora. Controlla il nome utente e la password e assicurati di aver usato l'indirizzo completo (compreso \"http\" o \"https\")";
 $a->strings["Diaspora Export"] = "Esporta Diaspora";
-$a->strings["Enable Diaspora Post Plugin"] = "Abilita il plugin di invio a Diaspora";
+$a->strings["Enable Diaspora Post Addon"] = "Abilita il componente aggiuntivo di invio a Diaspora";
 $a->strings["Diaspora username"] = "Nome utente Diaspora";
 $a->strings["Diaspora password"] = "Password Diaspora";
 $a->strings["Diaspora site URL"] = "Indirizzo sito Diaspora";
index 1034ffed6b0ad1bb67a65678a34ea162e09e4881..7b0bc7413d42101a7e60276a8534af69d2bda7ff 100644 (file)
@@ -34,7 +34,7 @@ msgid "Diaspora Export"
 msgstr ""
 
 #: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
+msgid "Enable Diaspora Post Addon"
 msgstr "Habilitar plug-in para publicar na Diaspora"
 
 #: diaspora.php:168
index 4ad834a1c32cf7fea5b2309b359ffe93ce15990b..11c6b1ecbb4d2149543794d5569a816a97d6492f 100644 (file)
@@ -33,7 +33,7 @@ msgid "Diaspora Export"
 msgstr "Exportare pe Diaspora "
 
 #: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
+msgid "Enable Diaspora Post Addon"
 msgstr "Activare Modul Postare pe Diaspora"
 
 #: diaspora.php:168
index c40ac8b68dabd9c5232d33a8a83f40cb341864f3..a679815853042a5bf7a7f9fcb1166f9b3c80fc05 100644 (file)
@@ -8,7 +8,7 @@ function string_plural_select_ro($n){
 $a->strings["Post to Diaspora"] = "Postați pe Diaspora";
 $a->strings["Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"] = "Nu se poate face autentificarea pe contul dvs. Diaspora. Verificați numele de utilizator şi parola şi asigurați-vă că ați folosit adresa completă  (inclusiv http ... )";
 $a->strings["Diaspora Export"] = "Exportare pe Diaspora ";
-$a->strings["Enable Diaspora Post Plugin"] = "Activare Modul Postare pe Diaspora";
+$a->strings["Enable Diaspora Post Addon"] = "Activare Modul Postare pe Diaspora";
 $a->strings["Diaspora username"] = "Utilizator Diaspora";
 $a->strings["Diaspora password"] = "Parola Diaspora";
 $a->strings["Diaspora site URL"] = "URL site Diaspora";
index 7a9322c9af8fa12d42e4367e2b534469b0fecd77..3534b0ac40e51c5d61abcc1e8e3e0c180ced9593 100644 (file)
@@ -34,7 +34,7 @@ msgid "Diaspora Export"
 msgstr "Экспорт в Diaspora"
 
 #: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
+msgid "Enable Diaspora Post Addon"
 msgstr "Включить плагин отправки сообщений в Diaspora"
 
 #: diaspora.php:168
index ac120995b7a7d78f83ff8e734080da69dea4ff92..0d46c78ded8fbad58af49816e3ec3d1ec9ff0f58 100644 (file)
@@ -8,7 +8,7 @@ function string_plural_select_ru($n){
 $a->strings["Post to Diaspora"] = "Отправить в Diaspora";
 $a->strings["Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"] = "Невозможно войти в вашу учетную запись Diaspora. Пожалуйста, проверьте имя пользователя, пароль и убедитесь, что вы ввели полный адрес пода (включая http/https)";
 $a->strings["Diaspora Export"] = "Экспорт в Diaspora";
-$a->strings["Enable Diaspora Post Plugin"] = "Включить плагин отправки сообщений в Diaspora";
+$a->strings["Enable Diaspora Post Addon"] = "Включить плагин отправки сообщений в Diaspora";
 $a->strings["Diaspora username"] = "Имя пользователя Diaspora";
 $a->strings["Diaspora password"] = "Пароль Diaspora";
 $a->strings["Diaspora site URL"] = "URL пода Diaspora";
index beb0d17a4f9c6aaac3c777675a46aa2df40a759e..c0a4978e1aa3a7cdafed24c732c8151c48cf9fe6 100644 (file)
@@ -34,7 +34,7 @@ msgid "Diaspora Export"
 msgstr "Diaspora 导出"
 
 #: diaspora.php:163
-msgid "Enable Diaspora Post Plugin"
+msgid "Enable Diaspora Post Addon"
 msgstr "启用 Diaspora 发文插件"
 
 #: diaspora.php:168
index 47c0f5560e13d1541232d2ff57e7ee6ddf0c7217..307a634f2e5b81f3afd90d09b710076ebd865e30 100644 (file)
@@ -8,7 +8,7 @@ function string_plural_select_zh_cn($n){
 $a->strings["Post to Diaspora"] = "发到 Diaspora";
 $a->strings["Can't login to your Diaspora account. Please check username and password and ensure you used the complete address (including http...)"] = "无法登录到你的 Diaspora 账户。请检查用户名和密码并确保你用了完整的地址(包括http...)";
 $a->strings["Diaspora Export"] = "Diaspora 导出";
-$a->strings["Enable Diaspora Post Plugin"] = "启用 Diaspora 发文插件";
+$a->strings["Enable Diaspora Post Addon"] = "启用 Diaspora 发文插件";
 $a->strings["Diaspora username"] = "Diaspora 用户名";
 $a->strings["Diaspora password"] = "Diaspora 密码";
 $a->strings["Diaspora site URL"] = "Diaspora 站点 URL";
index 25f7ac87484e56c3a3f87746bd9f11755314a1a0..1cdd87a99a2306080621e0db53c3815e96d1362b 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Name: Dreamwidth Post Connector
  * Description: Post to dreamwidth
@@ -9,20 +8,27 @@
  * Author: Cat Gray <https://free-haven.org/profile/catness>
  */
 
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
+
 function dwpost_install() {
-    register_hook('post_local',           'addon/dwpost/dwpost.php', 'dwpost_post_local');
-    register_hook('notifier_normal',      'addon/dwpost/dwpost.php', 'dwpost_send');
-    register_hook('jot_networks',         'addon/dwpost/dwpost.php', 'dwpost_jot_nets');
-    register_hook('connector_settings',      'addon/dwpost/dwpost.php', 'dwpost_settings');
-    register_hook('connector_settings_post', 'addon/dwpost/dwpost.php', 'dwpost_settings_post');
+       Addon::registerHook('post_local',           'addon/dwpost/dwpost.php', 'dwpost_post_local');
+       Addon::registerHook('notifier_normal',      'addon/dwpost/dwpost.php', 'dwpost_send');
+       Addon::registerHook('jot_networks',         'addon/dwpost/dwpost.php', 'dwpost_jot_nets');
+       Addon::registerHook('connector_settings',      'addon/dwpost/dwpost.php', 'dwpost_settings');
+       Addon::registerHook('connector_settings_post', 'addon/dwpost/dwpost.php', 'dwpost_settings_post');
 
 }
 function dwpost_uninstall() {
-    unregister_hook('post_local',       'addon/dwpost/dwpost.php', 'dwpost_post_local');
-    unregister_hook('notifier_normal',  'addon/dwpost/dwpost.php', 'dwpost_send');
-    unregister_hook('jot_networks',     'addon/dwpost/dwpost.php', 'dwpost_jot_nets');
-    unregister_hook('connector_settings',      'addon/dwpost/dwpost.php', 'dwpost_settings');
-    unregister_hook('connector_settings_post', 'addon/dwpost/dwpost.php', 'dwpost_settings_post');
+       Addon::unregisterHook('post_local',       'addon/dwpost/dwpost.php', 'dwpost_post_local');
+       Addon::unregisterHook('notifier_normal',  'addon/dwpost/dwpost.php', 'dwpost_send');
+       Addon::unregisterHook('jot_networks',     'addon/dwpost/dwpost.php', 'dwpost_jot_nets');
+       Addon::unregisterHook('connector_settings',      'addon/dwpost/dwpost.php', 'dwpost_settings');
+       Addon::unregisterHook('connector_settings_post', 'addon/dwpost/dwpost.php', 'dwpost_settings_post');
 
 }
 
@@ -36,7 +42,7 @@ function dwpost_jot_nets(&$a,&$b) {
         $dw_defpost = get_pconfig(local_user(),'dwpost','post_by_default');
         $selected = ((intval($dw_defpost) == 1) ? ' checked="checked" ' : '');
         $b .= '<div class="profile-jot-net"><input type="checkbox" name="dwpost_enable" ' . $selected . ' value="1" /> '
-            . t('Post to Dreamwidth') . '</div>';
+            . L10n::t('Post to Dreamwidth') . '</div>';
     }
 }
 
@@ -67,36 +73,36 @@ function dwpost_settings(&$a,&$s) {
     /* Add some HTML to the existing form */
 
     $s .= '<span id="settings_dwpost_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_dwpost_expanded\'); openClose(\'settings_dwpost_inflated\');">';
-    $s .= '<img class="connector" src="images/dreamwidth.png" /><h3 class="connector">'. t("Dreamwidth Export").'</h3>';
+    $s .= '<img class="connector" src="images/dreamwidth.png" /><h3 class="connector">'. L10n::t("Dreamwidth Export").'</h3>';
     $s .= '</span>';
     $s .= '<div id="settings_dwpost_expanded" class="settings-block" style="display: none;">';
     $s .= '<span class="fakelink" onclick="openClose(\'settings_dwpost_expanded\'); openClose(\'settings_dwpost_inflated\');">';
-    $s .= '<img class="connector" src="images/dreamwidth.png" /><h3 class="connector">'. t("Dreamwidth Export").'</h3>';
+    $s .= '<img class="connector" src="images/dreamwidth.png" /><h3 class="connector">'. L10n::t("Dreamwidth Export").'</h3>';
     $s .= '</span>';
 
     $s .= '<div id="dwpost-enable-wrapper">';
-    $s .= '<label id="dwpost-enable-label" for="dwpost-checkbox">' . t('Enable dreamwidth Post Plugin') . '</label>';
+    $s .= '<label id="dwpost-enable-label" for="dwpost-checkbox">' . L10n::t('Enable dreamwidth Post Addon') . '</label>';
     $s .= '<input id="dwpost-checkbox" type="checkbox" name="dwpost" value="1" ' . $checked . '/>';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="dwpost-username-wrapper">';
-    $s .= '<label id="dwpost-username-label" for="dwpost-username">' . t('dreamwidth username') . '</label>';
+    $s .= '<label id="dwpost-username-label" for="dwpost-username">' . L10n::t('dreamwidth username') . '</label>';
     $s .= '<input id="dwpost-username" type="text" name="dw_username" value="' . $dw_username . '" />';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="dwpost-password-wrapper">';
-    $s .= '<label id="dwpost-password-label" for="dwpost-password">' . t('dreamwidth password') . '</label>';
+    $s .= '<label id="dwpost-password-label" for="dwpost-password">' . L10n::t('dreamwidth password') . '</label>';
     $s .= '<input id="dwpost-password" type="password" name="dw_password" value="' . $dw_password . '" />';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="dwpost-bydefault-wrapper">';
-    $s .= '<label id="dwpost-bydefault-label" for="dwpost-bydefault">' . t('Post to dreamwidth by default') . '</label>';
+    $s .= '<label id="dwpost-bydefault-label" for="dwpost-bydefault">' . L10n::t('Post to dreamwidth by default') . '</label>';
     $s .= '<input id="dwpost-bydefault" type="checkbox" name="dw_bydefault" value="1" ' . $def_checked . '/>';
     $s .= '</div><div class="clear"></div>';
 
     /* provide a submit button */
 
-    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="dwpost-submit" name="dwpost-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="dwpost-submit" name="dwpost-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
 }
 
@@ -173,16 +179,12 @@ function dwpost_send(&$a,&$b) {
        $dw_blog = 'http://www.dreamwidth.org/interface/xmlrpc';
 
        if($dw_username && $dw_password && $dw_blog) {
-
-               require_once('include/bbcode.php');
-               require_once('include/datetime.php');
-
                $title = $b['title'];
-               $post = bbcode($b['body']);
+               $post = BBCode::convert($b['body']);
                $post = xmlify($post);
                $tags = dwpost_get_tags($b['tag']);
 
-               $date = datetime_convert('UTC',$tz,$b['created'],'Y-m-d H:i:s');
+               $date = DateTimeFormat::convert($b['created'], $tz);
                $year = intval(substr($date,0,4));
                $mon  = intval(substr($date,5,2));
                $day  = intval(substr($date,8,2));
@@ -218,10 +220,10 @@ EOT;
 
                logger('dwpost: data: ' . $xml, LOGGER_DATA);
 
-               if($dw_blog !== 'test')
-                       $x = post_url($dw_blog,$xml,array("Content-Type: text/xml"));
+               if($dw_blog !== 'test') {
+                       $x = Network::post($dw_blog, $xml, ["Content-Type: text/xml"]);
+               }
                logger('posted to dreamwidth: ' . ($x) ? $x : '', LOGGER_DEBUG);
-
        }
 }
 
index 6bed922ffc58205dfe6c51f374e807c2ae641f18..c81e9f0fa4b6792d2eba15a583f4b636112d7c3a 100644 (file)
@@ -26,7 +26,7 @@ msgid "Dreamwidth Post Settings"
 msgstr ""
 
 #: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
+msgid "Enable dreamwidth Post Addon"
 msgstr ""
 
 #: dwpost.php:77
index 6ad56a9b5a5d7b413511ec6c83bd792587c3caf8..3b7df6d052577d19394574cabe9a5f8395351d10 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Dreamwidth"] = "Missatge a Dreamwidth";\r
 $a->strings["Dreamwidth Post Settings"] = "Configuració d'enviaments a Dreamwidth";\r
-$a->strings["Enable dreamwidth Post Plugin"] = "Habilitat el plugin d'enviaments a Dreamwidth";\r
+$a->strings["Enable dreamwidth Post Addon"] = "Habilitat el addon d'enviaments a Dreamwidth";\r
 $a->strings["dreamwidth username"] = "Nom d'usuari a Dreamwidth";\r
 $a->strings["dreamwidth password"] = "Contrasenya a Dreamwidth";\r
 $a->strings["Post to dreamwidth by default"] = "Enviar per defecte a Dreamwidth";\r
index 2291657a3276bb513cdd47b1841e52b82879ded2..fb01a38e134dc776aa07f0361ebd7c4a21e928ee 100644 (file)
@@ -28,8 +28,8 @@ msgid "Dreamwidth Post Settings"
 msgstr "Dreamwidth nastavení příspěvků"
 
 #: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
-msgstr "Povolit dreamwidth Plugin"
+msgid "Enable dreamwidth Post Addon"
+msgstr "Povolit dreamwidth Addon"
 
 #: dwpost.php:77
 msgid "dreamwidth username"
index 6d02b09f622c54d55d4ab4877d827a6e5498ac70..df348a8396b06018610d12eb1b2f35f3e2305140 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_cs($n){
 ;
 $a->strings["Post to Dreamwidth"] = "Poslat na Dreamwidth";
 $a->strings["Dreamwidth Post Settings"] = "Dreamwidth nastavení příspěvků";
-$a->strings["Enable dreamwidth Post Plugin"] = "Povolit dreamwidth Plugin";
+$a->strings["Enable dreamwidth Post Addon"] = "Povolit dreamwidth Addon";
 $a->strings["dreamwidth username"] = "dreamwidth uživatelské jméno";
 $a->strings["dreamwidth password"] = "dreamwidth heslo";
 $a->strings["Post to dreamwidth by default"] = "Defaultně umístit na dreamwidth";
index 81507eed8d2f7b457006302cd9a3e2a3795f6dc8..07e6beb6506543f5fccc852bd0b5227e02151702 100644 (file)
@@ -29,8 +29,8 @@ msgid "Dreamwidth Post Settings"
 msgstr "Dreamwidth Veröffentlichungs-Einstellungen"
 
 #: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
-msgstr "Dreamwidth Post Plugin aktivieren"
+msgid "Enable dreamwidth Post Addon"
+msgstr "Dreamwidth Post Addon aktivieren"
 
 #: dwpost.php:77
 msgid "dreamwidth username"
index a809589977ae6a889eb34ba7128c2b23d05b6037..a810f79efb1a3b8efe1f2ae5731e8e4933298489 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_de($n){
 ;
 $a->strings["Post to Dreamwidth"] = "In Dreamwidth veröffentlichen";
 $a->strings["Dreamwidth Post Settings"] = "Dreamwidth Veröffentlichungs-Einstellungen";
-$a->strings["Enable dreamwidth Post Plugin"] = "Dreamwidth Post Plugin aktivieren";
+$a->strings["Enable dreamwidth Post Addon"] = "Dreamwidth Post Addon aktivieren";
 $a->strings["dreamwidth username"] = "Dreamwidth Benutzername";
 $a->strings["dreamwidth password"] = "Dreamwidth Passwort";
 $a->strings["Post to dreamwidth by default"] = "Standardmäßig bei Dreamwidth veröffentlichen";
index 967d4b9b6bea55b9817a6adfe8a81379eed47e0e..d0c96db6eac196da1a5c0bb609ff043057d3dfe6 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Dreamwidth"] = "Afiŝi al Dreamwidth";\r
 $a->strings["Dreamwidth Post Settings"] = "Agordoj por Afiŝoj al Dreamwidth";\r
-$a->strings["Enable dreamwidth Post Plugin"] = "Ŝalti la Dreamwidth Kromprogramon";\r
+$a->strings["Enable dreamwidth Post Addon"] = "Ŝalti la Dreamwidth Kromprogramon";\r
 $a->strings["dreamwidth username"] = "Dreamwidth salutnomo";\r
 $a->strings["dreamwidth password"] = "Dreamwidth pasvorto";\r
 $a->strings["Post to dreamwidth by default"] = "Defaŭlte afiŝi al Dreamwidth";\r
index 10368bb28954e0354c991937648cd1d60f59312d..18036677aae0748976fd84f26b18bf7ef85da5b2 100644 (file)
@@ -28,8 +28,8 @@ msgid "Dreamwidth Post Settings"
 msgstr "Ajustes de publicación de Dreamwidth"
 
 #: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
-msgstr "Activar el plugin de publicación dreamwidth"
+msgid "Enable dreamwidth Post Addon"
+msgstr "Activar el addon de publicación dreamwidth"
 
 #: dwpost.php:77
 msgid "dreamwidth username"
index 646b945bd8211135882082129bb572840194484d..4c5c116f42ffbaed83318847a77b3999a7244b08 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_es($n){
 ;
 $a->strings["Post to Dreamwidth"] = "Publicar en Dreamwidth";
 $a->strings["Dreamwidth Post Settings"] = "Ajustes de publicación de Dreamwidth";
-$a->strings["Enable dreamwidth Post Plugin"] = "Activar el plugin de publicación dreamwidth";
+$a->strings["Enable dreamwidth Post Addon"] = "Activar el addon de publicación dreamwidth";
 $a->strings["dreamwidth username"] = "Nombre de usuario de dreamwidth";
 $a->strings["dreamwidth password"] = "Contraseña de dreamwidth";
 $a->strings["Post to dreamwidth by default"] = "Publicar en dreamwidth por defecto";
index d0010280a40e7a04a3fe263e3343db9f54fc223a..1277d5901d3838e9ef0841237adec7e6bc3dfdbc 100644 (file)
@@ -29,7 +29,7 @@ msgid "Dreamwidth Post Settings"
 msgstr "Paramètres pour Dreamwidth"
 
 #: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
+msgid "Enable dreamwidth Post Addon"
 msgstr ""
 
 #: dwpost.php:77
index 138d9d8ad63fbdf81bcb71c68f3024193328a2ec..5ecda4717b0f97e0f304f8d5705f021f115e8f82 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_fr($n){
 ;
 $a->strings["Post to Dreamwidth"] = "Publier sur Dreamwidth";
 $a->strings["Dreamwidth Post Settings"] = "Paramètres pour Dreamwidth";
-$a->strings["Enable dreamwidth Post Plugin"] = "";
+$a->strings["Enable dreamwidth Post Addon"] = "";
 $a->strings["dreamwidth username"] = "Nom d'utilisateur Dreamwidth";
 $a->strings["dreamwidth password"] = "Mot de passe dreamwidth";
 $a->strings["Post to dreamwidth by default"] = "Poster sur Dreamwidth par défaut";
index 96f1f78b06cf42c17798a81cf184552f47a5c3b1..e5fee40076238bc09e69b34273d1ccc80bfb8e5f 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Dreamwidth"] = "";\r
 $a->strings["Dreamwidth Post Settings"] = "";\r
-$a->strings["Enable dreamwidth Post Plugin"] = "";\r
+$a->strings["Enable dreamwidth Post Addon"] = "";\r
 $a->strings["dreamwidth username"] = "";\r
 $a->strings["dreamwidth password"] = "";\r
 $a->strings["Post to dreamwidth by default"] = "";\r
index dbd210168ed1a8fe30f8c7128597bb6fd1263263..9ce05fe24f93d397f8ce7201006d38f9c08adc86 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-10-22 07:54+0000\n"
+"PO-Revision-Date: 2018-03-19 13:21+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -21,15 +21,15 @@ msgstr ""
 
 #: dwpost.php:39
 msgid "Post to Dreamwidth"
-msgstr "Posta su Dreamwidth"
+msgstr "Invia a Dreamwidth"
 
 #: dwpost.php:70
 msgid "Dreamwidth Post Settings"
-msgstr "Impostazioni di invio a Dreamwidth"
+msgstr "Impostazioni Invio a Dreeamwidth"
 
 #: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
-msgstr "Abilita il plugin di invio a Dreamwidth"
+msgid "Enable dreamwidth Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio a Dreamwidth"
 
 #: dwpost.php:77
 msgid "dreamwidth username"
@@ -45,4 +45,4 @@ msgstr "Invia sempre a Dreamwidth"
 
 #: dwpost.php:93
 msgid "Submit"
-msgstr "Invia"
+msgstr "Salva"
index 5cded6e11130d0ed5f26f0da125dae8931aeabfd..0f40abc654b8cc4e2f05758a1f4a16c58132df8f 100644 (file)
@@ -5,10 +5,10 @@ function string_plural_select_it($n){
        return ($n != 1);;
 }}
 ;
-$a->strings["Post to Dreamwidth"] = "Posta su Dreamwidth";
-$a->strings["Dreamwidth Post Settings"] = "Impostazioni di invio a Dreamwidth";
-$a->strings["Enable dreamwidth Post Plugin"] = "Abilita il plugin di invio a Dreamwidth";
+$a->strings["Post to Dreamwidth"] = "Invia a Dreamwidth";
+$a->strings["Dreamwidth Post Settings"] = "Impostazioni Invio a Dreeamwidth";
+$a->strings["Enable dreamwidth Post Addon"] = "Abilita il componente aggiuntivo di invio a Dreamwidth";
 $a->strings["dreamwidth username"] = "Nome utente Dreamwidth";
 $a->strings["dreamwidth password"] = "password Dreamwidth";
 $a->strings["Post to dreamwidth by default"] = "Invia sempre a Dreamwidth";
-$a->strings["Submit"] = "Invia";
+$a->strings["Submit"] = "Salva";
index 37677e6df7af6bc21083a629bd384622d49c7861..c4ea612b398007f166df55b815b006c4a09ba13e 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Dreamwidth"] = "";\r
 $a->strings["Dreamwidth Post Settings"] = "";\r
-$a->strings["Enable dreamwidth Post Plugin"] = "";\r
+$a->strings["Enable dreamwidth Post Addon"] = "";\r
 $a->strings["dreamwidth username"] = "";\r
 $a->strings["dreamwidth password"] = "";\r
 $a->strings["Post to dreamwidth by default"] = "";\r
index 237c95d94014e3797122c8a40269361399f0b8ff..9f1ff04e7482fbe7c5beb79e9f8f668975246519 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Dreamwidth"] = "Opublikuj na Dreamwidth";\r
 $a->strings["Dreamwidth Post Settings"] = "";\r
-$a->strings["Enable dreamwidth Post Plugin"] = "";\r
+$a->strings["Enable dreamwidth Post Addon"] = "";\r
 $a->strings["dreamwidth username"] = "";\r
 $a->strings["dreamwidth password"] = "";\r
 $a->strings["Post to dreamwidth by default"] = "";\r
index 26c3bba6e1d1f2fb48390206865a9cc61479af31..f0e49e4e3e96713d5c20070630ee471f50a05143 100644 (file)
@@ -28,7 +28,7 @@ msgid "Dreamwidth Post Settings"
 msgstr "Configurações de publicação no Dreamwidth"
 
 #: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
+msgid "Enable dreamwidth Post Addon"
 msgstr "Habilitar plug-in para publicar no Dreamwidth"
 
 #: dwpost.php:77
index 329cf9e3f066e0d59d5f755786d4a0cc0e09b0e6..03dc7d2d269b29f587694cc656d32b03d8e43dc5 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Dreamwidth"] = "Publicar no Dreamwidth";\r
 $a->strings["Dreamwidth Post Settings"] = "Configurações de publicação no Dreamwidth";\r
-$a->strings["Enable dreamwidth Post Plugin"] = "Habilitar o plugin de publicação no Dreamwidth";\r
+$a->strings["Enable dreamwidth Post Addon"] = "Habilitar o addon de publicação no Dreamwidth";\r
 $a->strings["dreamwidth username"] = "Nome de usuário do Dreamwidth";\r
 $a->strings["dreamwidth password"] = "Senha do Dreamwidth";\r
 $a->strings["Post to dreamwidth by default"] = "Publicar no Dreamwidth por padrão";\r
index f2fd9e0c57248838b0c069bd9d8215d56e1816bc..91285968699f7f90df2bec4917aa36be47506018 100644 (file)
@@ -28,7 +28,7 @@ msgid "Dreamwidth Post Settings"
 msgstr "Configurări Postări Dreamwidth "
 
 #: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
+msgid "Enable dreamwidth Post Addon"
 msgstr "Activare Modul Postare pe Dreamwidth"
 
 #: dwpost.php:77
index d50f38037fc9b5b9c7a130f45f51d8befa9aa01d..ed3ece27f2626d617f6b19ba9aa7941a97f2f185 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_ro($n){
 ;
 $a->strings["Post to Dreamwidth"] = "Postați pe Dreamwidth";
 $a->strings["Dreamwidth Post Settings"] = "Configurări Postări Dreamwidth ";
-$a->strings["Enable dreamwidth Post Plugin"] = "Activare Modul Postare pe Dreamwidth";
+$a->strings["Enable dreamwidth Post Addon"] = "Activare Modul Postare pe Dreamwidth";
 $a->strings["dreamwidth username"] = "Utilizator Dreamwidth";
 $a->strings["dreamwidth password"] = "Parola Dreamwidth ";
 $a->strings["Post to dreamwidth by default"] = "Postați implicit pe Dreamwidth";
index fc01bce0e21485b79f25e9519e2d8cd00bab8362..93e400e549ee332c69ff383de74605dcc35076f9 100644 (file)
@@ -28,7 +28,7 @@ msgid "Dreamwidth Post Settings"
 msgstr "Настройки сообщений Dreamwidth"
 
 #: dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
+msgid "Enable dreamwidth Post Addon"
 msgstr "Включить плагин отправки сообщений в Dreamwidth"
 
 #: dwpost.php:77
index db1b2755de1b53bad594dff79fa74695873f008f..7b6e5f47187d92949569ad2db5a83f7731c50400 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_ru($n){
 ;
 $a->strings["Post to Dreamwidth"] = "Отправить в Dreamwidth";
 $a->strings["Dreamwidth Post Settings"] = "Настройки сообщений Dreamwidth";
-$a->strings["Enable dreamwidth Post Plugin"] = "Включить плагин отправки сообщений в Dreamwidth";
+$a->strings["Enable dreamwidth Post Addon"] = "Включить плагин отправки сообщений в Dreamwidth";
 $a->strings["dreamwidth username"] = "Имя пользователя Dreamwidth";
 $a->strings["dreamwidth password"] = "Пароль Dreamwidth";
 $a->strings["Post to dreamwidth by default"] = "Отправлять сообщения в Dreamwidth по умолчанию";
index 93e075c6ff4e9103d44ea6ac5feed7dd2af13c4c..131cd9fa2a3b7baa335907a2668c58e91cfd2d31 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Dreamwidth"] = "转播到Dreamwidth";\r
 $a->strings["Dreamwidth Post Settings"] = "Dreamwidth转播设置";\r
-$a->strings["Enable dreamwidth Post Plugin"] = "使Dreamwidth转播插件可用";\r
+$a->strings["Enable dreamwidth Post Addon"] = "使Dreamwidth转播插件可用";\r
 $a->strings["dreamwidth username"] = "Dreamwidth用户名";\r
 $a->strings["dreamwidth password"] = "Dreamwidth密码";\r
 $a->strings["Post to dreamwidth by default"] = "默认地转播到Dreamwidth";\r
index 427d620c20661a2f92ce8507c834f38d95d2b95d..8c15caa6d9a6df18732d8fb9aa6796f4a22f6159 100644 (file)
@@ -5,31 +5,34 @@
  * Version: 1.0
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
  */
+use Friendica\Core\Addon;
+use Friendica\Util\Network;
 
 // IMPORTANT: SET THIS to your fortunate server
 
-define ('FORTUNATE_SERVER', 'hostname.com');
+define('FORTUNATE_SERVER', 'hostname.com');
 
-function fortunate_install() {
-       register_hook('page_end', 'addon/fortunate/fortunate.php', 'fortunate_fetch');
-       if(FORTUNATE_SERVER == 'hostname.com' && is_site_admin()) {
-               notice('Fortunate plugin requires configuration. See README');
+function fortunate_install()
+{
+       Addon::registerHook('page_end', 'addon/fortunate/fortunate.php', 'fortunate_fetch');
+       if (FORTUNATE_SERVER == 'hostname.com' && is_site_admin()) {
+               notice('Fortunate addon requires configuration. See README');
        }
 }
 
-function fortunate_uninstall() {
-       unregister_hook('page_end', 'addon/fortunate/fortunate.php', 'fortunate_fetch');
+function fortunate_uninstall()
+{
+       Addon::unregisterHook('page_end', 'addon/fortunate/fortunate.php', 'fortunate_fetch');
 }
 
 
-function fortunate_fetch(&$a,&$b) {
-
+function fortunate_fetch(&$a, &$b)
+{
        $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' 
                . $a->get_baseurl() . '/addon/fortunate/fortunate.css' . '" media="all" />' . "\r\n";
 
-       if(FORTUNATE_SERVER != 'hostname.com') {
-               $s = fetch_url('http://' . FORTUNATE_SERVER . '/cookie.php?numlines=2&equal=1&rand=' . mt_rand());
+       if (FORTUNATE_SERVER != 'hostname.com') {
+               $s = Network::fetchUrl('http://' . FORTUNATE_SERVER . '/cookie.php?numlines=2&equal=1&rand=' . mt_rand());
                $b .= '<div class="fortunate">' . $s . '</div>';
        }
 }
-
index a709c9b1edc88979db81ba2bc284c6c14f3b87a4..751384a8ec0e92a12309deca860c531e3c56b055 100644 (file)
 <?php
 /**
-* Name: Forum Directory
-* Description: Add a directory of forums hosted on your server, with verbose descriptions.
-* Version: 1.0
-* Author: Thomas Willingham <https://beardyunixer.com/profile/beardyunixer>
-*/
-
-function forumdirectory_install() {
-register_hook('app_menu', 'addon/forumdirectory/forumdirectory.php', 'forumdirectory_app_menu');
+ * Name: Forum Directory
+ * Description: Add a directory of forums hosted on your server, with verbose descriptions.
+ * Version: 1.0
+ * Author: Thomas Willingham <https://beardyunixer.com/profile/beardyunixer>
+ */
+
+use Friendica\Content\Nav;
+use Friendica\Content\Widget;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Database\DBM;
+use Friendica\Model\Profile;
+use Friendica\Util\Temporal;
+
+require_once 'boot.php';
+require_once 'include/dba.php';
+require_once 'include/text.php';
+
+function forumdirectory_install()
+{
+       Addon::registerHook('app_menu', 'addon/forumdirectory/forumdirectory.php', 'forumdirectory_app_menu');
 }
 
-function forumdirectory_uninstall() {
-unregister_hook('app_menu', 'addon/forumdirectory/forumdirectory.php', 'forumdirectory_app_menu');
+function forumdirectory_uninstall()
+{
+       Addon::unregisterHook('app_menu', 'addon/forumdirectory/forumdirectory.php', 'forumdirectory_app_menu');
 }
 
-function forumdirectory_module() {
-return;
+function forumdirectory_module()
+{
+       return;
 }
 
-function forumdirectory_app_menu($a,&$b) {
-$b['app_menu'][] = '<div class="app-title"><a href="forumdirectory">' . t('Forum Directory') . '</a></div>';
+function forumdirectory_app_menu($a, &$b)
+{
+       $b['app_menu'][] = '<div class="app-title"><a href="forumdirectory">' . L10n::t('Forum Directory') . '</a></div>';
 }
 
-function forumdirectory_init(&$a) {
-       $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'.$a->get_baseurl().'/addon/forumdirectory/forumdirectory.css" media="all" />';
+function forumdirectory_init(&$a)
+{
+       $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/forumdirectory/forumdirectory.css" media="all" />';
 
        $a->set_pager_itemspage(60);
 
-       if(local_user()) {
-               require_once('include/contact_widgets.php');
-
-               $a->page['aside'] .= findpeople_widget();
-
-       }
-       else
+       if (local_user()) {
+               $a->page['aside'] .= Widget::findPeople();
+       } else {
                unset($_SESSION['theme']);
-
-
+       }
 }
 
-
-function forumdirectory_post(&$a) {
-       if(x($_POST,'search'))
+function forumdirectory_post(&$a)
+{
+       if (x($_POST, 'search')) {
                $a->data['search'] = $_POST['search'];
+       }
 }
 
-
-
-function forumdirectory_content(&$a) {
-
-       if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
-               notice( t('Public access denied.') . EOL);
+function forumdirectory_content(&$a)
+{
+       if ((Config::get('system', 'block_public')) && (!local_user()) && (!remote_user())) {
+               notice(L10n::t('Public access denied.') . EOL);
                return;
        }
 
        $o = '';
-       nav_set_selected('directory');
+       Nav::setSelected('directory');
 
-       if(x($a->data,'search'))
+       if (x($a->data, 'search')) {
                $search = notags(trim($a->data['search']));
-       else
-               $search = ((x($_GET,'search')) ? notags(trim(rawurldecode($_GET['search']))) : '');
+       } else {
+               $search = ((x($_GET, 'search')) ? notags(trim(rawurldecode($_GET['search']))) : '');
+       }
 
        $tpl = get_markup_template('directory_header.tpl');
 
        $globaldir = '';
-       $gdirpath = get_config('system','directory');
-       if(strlen($gdirpath)) {
+       $gdirpath = Config::get('system', 'directory');
+       if (strlen($gdirpath)) {
                $globaldir = '<ul><li><div id="global-directory-link"><a href="'
-               . zrl($gdirpath,true) . '">' . t('Global Directory') . '</a></div></li></ul>';
+                       . Profile::zrl($gdirpath, true) . '">' . L10n::t('Global Directory') . '</a></div></li></ul>';
        }
 
        $admin = '';
 
-       $o .= replace_macros($tpl, array(
-               '$search' => $search,
+       $o .= replace_macros($tpl, [
+               '$search'    => $search,
                '$globaldir' => $globaldir,
-               '$desc' => t('Find on this site'),
-               '$admin' => $admin,
-               '$finding' => (strlen($search) ? '<h4>' . t('Finding: ') . "'" . $search . "'" . '</h4>' : ""),
-               '$sitedir' => t('Site Directory'),
-               '$submit' => t('Find')
-       ));
-
-       if($search)
-               $search = dbesc($search);
-       $sql_extra = ((strlen($search)) ? " AND MATCH (`profile`.`name`, `user`.`nickname`, `pdesc`, `locality`,`region`,`country-name`,`gender`,`marital`,`sexual`,`about`,`romance`,`work`,`education`,`pub_keywords`,`prv_keywords` ) AGAINST ('$search' IN BOOLEAN MODE) " : "");
-
-       $publish = ((get_config('system','publish_all')) ? '' : " AND `publish` = 1 " );
+               '$desc'      => L10n::t('Find on this site'),
+               '$admin'     => $admin,
+               '$finding'   => (strlen($search) ? '<h4>' . L10n::t('Finding: ') . "'" . $search . "'" . '</h4>' : ""),
+               '$sitedir'   => L10n::t('Site Directory'),
+               '$submit'    => L10n::t('Find')
+       ]);
+
+       $sql_extra = '';
+       if (strlen($search)) {
+               $sql_extra = " AND MATCH (`profile`.`name`, `user`.`nickname`, `pdesc`, `locality`,`region`,`country-name`,"
+                       . "`gender`,`marital`,`sexual`,`about`,`romance`,`work`,`education`,`pub_keywords`,`prv_keywords` )"
+                       . " AGAINST ('" . dbesc($search) . "' IN BOOLEAN MODE) ";
+       }
 
+       $publish = Config::get('system', 'publish_all') ? '' : " AND `publish` = 1 ";
 
-       $r = q("SELECT COUNT(*) AS `total` FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 AND `page-flags` = 2 $sql_extra ");
-       if(count($r))
+       $r = q("SELECT COUNT(*) AS `total` FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid`"
+               . " WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 AND `page-flags` = 2 $sql_extra ");
+       if (DBM::is_result($r)) {
                $a->set_pager_total($r[0]['total']);
+       }
 
        $order = " ORDER BY `name` ASC "; 
 
-
-       $r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`, `user`.`timezone` , `user`.`page-flags` FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 AND `page-flags` = 2 $sql_extra $order LIMIT %d , %d ",
+       $r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`, `user`.`timezone` , `user`.`page-flags`"
+               . " FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` WHERE `is-default` = 1 $publish"
+               . " AND `user`.`blocked` = 0 AND `page-flags` = 2 $sql_extra $order LIMIT %d , %d ",
                intval($a->pager['start']),
                intval($a->pager['itemspage'])
        );
-       if(count($r)) {
 
-               if(in_array('small', $a->argv))
+       if (DBM::is_result($r)) {
+               if (in_array('small', $a->argv)) {
                        $photo = 'thumb';
-               else
+               } else {
                        $photo = 'photo';
+               }
 
-               foreach($r as $rr) {
-
-
+               foreach ($r as $rr) {
                        $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
                
                        $pdesc = (($rr['pdesc']) ? $rr['pdesc'] . '<br />' : '');
 
                        $details = '';
-                       if(strlen($rr['locality']))
+                       if (strlen($rr['locality'])) {
                                $details .= $rr['locality'];
-                       if(strlen($rr['region'])) {
-                               if(strlen($rr['locality']))
+                       }
+
+                       if (strlen($rr['region'])) {
+                               if (strlen($rr['locality'])) {
                                        $details .= ', ';
+                               }
                                $details .= $rr['region'];
                        }
-                       if(strlen($rr['country-name'])) {
-                               if(strlen($details))
+                       if (strlen($rr['country-name'])) {
+                               if (strlen($details)) {
                                        $details .= ', ';
+                               }
                                $details .= $rr['country-name'];
                        }
-                       if(strlen($rr['dob'])) {
-                               if(($years = age($rr['dob'],$rr['timezone'],'')) != 0)
-                                       $details .= '<br />' . t('Age: ') . $years ; 
+
+                       if (strlen($rr['dob']) && ($years = Temporal::getAgeByTimezone($rr['dob'], $rr['timezone'], '')) != 0) {
+                               $details .= '<br />' . L10n::t('Age: ') . $years;
                        }
-                       if(strlen($rr['gender']))
-                               $details .= '<br />' . t('Gender: ') . $rr['gender'];
-
-                       if($rr['page-flags'] == PAGE_NORMAL)
-                               $page_type = "Personal Profile";
-                       if($rr['page-flags'] == PAGE_SOAPBOX)
-                               $page_type = "Fan Page";
-                       if($rr['page-flags'] == PAGE_COMMUNITY)
-                               $page_type = "Community Forum";
-                       if($rr['page-flags'] == PAGE_FREELOVE)
-                               $page_type = "Open Forum";
-                       if($rr['page-flags'] == PAGE_PRVGROUP)
-                               $page_type = "Private Group";
 
-                       $profile = $rr;
+                       if (strlen($rr['gender'])) {
+                               $details .= '<br />' . L10n::t('Gender: ') . $rr['gender'];
+                       }
 
-                       if((x($profile,'address') == 1)
-                               || (x($profile,'locality') == 1)
-                               || (x($profile,'region') == 1)
-                               || (x($profile,'postal-code') == 1)
-                               || (x($profile,'country-name') == 1))
-                       $location = t('Location:');
+                       switch ($rr['page-flags']) {
+                               case PAGE_NORMAL   : $page_type = "Personal Profile"; break;
+                               case PAGE_SOAPBOX  : $page_type = "Fan Page"        ; break;
+                               case PAGE_COMMUNITY: $page_type = "Community Forum" ; break;
+                               case PAGE_FREELOVE : $page_type = "Open Forum"      ; break;
+                               case PAGE_PRVGROUP : $page_type = "Private Group"   ; break;
+                       }
 
-                       $gender = ((x($profile,'gender') == 1) ? t('Gender:') : False);
+                       $profile = $rr;
 
-                       $marital = ((x($profile,'marital') == 1) ?  t('Status:') : False);
+                       $location = '';
+                       if (x($profile, 'address') == 1
+                               || x($profile, 'locality') == 1
+                               || x($profile, 'region') == 1
+                               || x($profile, 'postal-code') == 1
+                               || x($profile, 'country-name') == 1
+                       ) {
+                               $location = L10n::t('Location:');
+                       }
 
-                       $homepage = ((x($profile,'homepage') == 1) ?  t('Homepage:') : False);
+                       $gender   = x($profile, 'gender')   == 1 ? L10n::t('Gender:')   : false;
+                       $marital  = x($profile, 'marital')  == 1 ? L10n::t('Status:')   : false;
+                       $homepage = x($profile, 'homepage') == 1 ? L10n::t('Homepage:') : false;
+                       $about    = x($profile, 'about')    == 1 ? L10n::t('About:')    : false;
 
-                       $about = ((x($profile,'about') == 1) ?  t('About:') : False);
-                       
-#                      $tpl = file_get_contents( dirname(__file__).'/forumdirectory_item.tpl');
-                       $tpl = get_markup_template( 'forumdirectory_item.tpl', 'addon/forumdirectory/' );
+                       $tpl = get_markup_template('forumdirectory_item.tpl', 'addon/forumdirectory/');
 
-                       $entry = replace_macros($tpl,array(
-                               '$id' => $rr['id'],
+                       $entry = replace_macros($tpl, [
+                               '$id'           => $rr['id'],
                                '$profile_link' => $profile_link,
-                               '$photo' => $a->get_cached_avatar_image($rr[$photo]),
-                               '$alt_text' => $rr['name'],
-                               '$name' => $rr['name'],
-                               '$details' => $pdesc . $details,
-                               '$page_type' => $page_type,
-                               '$profile' => $profile,
-                               '$location' => template_escape($location),
-                               '$gender'   => $gender,
-                               '$pdesc'        => $pdesc,
-                               '$marital'  => $marital,
-                               '$homepage' => $homepage,
-                               '$about' => $about,
-
-                       ));
-
-                       $arr = array('contact' => $rr, 'entry' => $entry);
-
-                       unset($profile);
-                       unset($location);
+                               '$photo'        => $rr[$photo],
+                               '$alt_text'     => $rr['name'],
+                               '$name'         => $rr['name'],
+                               '$details'      => $pdesc . $details,
+                               '$page_type'    => $page_type,
+                               '$profile'      => $profile,
+                               '$location'     => $location,
+                               '$gender'       => $gender,
+                               '$pdesc'        => $pdesc,
+                               '$marital'      => $marital,
+                               '$homepage'     => $homepage,
+                               '$about'        => $about,
+                       ]);
 
                        $o .= $entry;
-
                }
 
                $o .= "<div class=\"directory-end\" ></div>\r\n";
                $o .= paginate($a);
-
+       } else {
+               info(L10n::t("No entries \x28some entries may be hidden\x29.") . EOL);
        }
-       else
-               info( t("No entries \x28some entries may be hidden\x29.") . EOL);
 
        return $o;
 }
index ca53442c36a3c7794c6d33c1ee33da5c2f0fac13..99fbee13238850b7c950952dfdc2f1b8749b96bb 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-09-10 12:04+0000\n"
+"PO-Revision-Date: 2017-09-20 06:07+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index de8587445d9e32b621db06ae22752711139e91dc..a3944d6dbaef43268d5b264dcdde644647a0593b 100644 (file)
@@ -6,42 +6,44 @@
  * Author: Commander Zot
  *
  */
-
-
-function fromapp_install() {
-
-       register_hook('post_local', 'addon/fromapp/fromapp.php', 'fromapp_post_hook');
-       register_hook('plugin_settings', 'addon/fromapp/fromapp.php', 'fromapp_settings');
-       register_hook('plugin_settings_post', 'addon/fromapp/fromapp.php', 'fromapp_settings_post');
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+
+function fromapp_install()
+{
+       Addon::registerHook('post_local', 'addon/fromapp/fromapp.php', 'fromapp_post_hook');
+       Addon::registerHook('addon_settings', 'addon/fromapp/fromapp.php', 'fromapp_settings');
+       Addon::registerHook('addon_settings_post', 'addon/fromapp/fromapp.php', 'fromapp_settings_post');
        logger("installed fromapp");
 }
 
 
-function fromapp_uninstall() {
-
-       unregister_hook('post_local', 'addon/fromapp/fromapp.php', 'fromapp_post_hook');
-       unregister_hook('plugin_settings', 'addon/fromapp/fromapp.php', 'fromapp_settings');
-       unregister_hook('plugin_settings_post', 'addon/fromapp/fromapp.php', 'fromapp_settings_post');
-
-
+function fromapp_uninstall()
+{
+       Addon::unregisterHook('post_local', 'addon/fromapp/fromapp.php', 'fromapp_post_hook');
+       Addon::unregisterHook('addon_settings', 'addon/fromapp/fromapp.php', 'fromapp_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/fromapp/fromapp.php', 'fromapp_settings_post');
        logger("removed fromapp");
 }
 
-function fromapp_settings_post($a,$post) {
-       if(! local_user() || (! x($_POST,'fromapp-submit')))
+function fromapp_settings_post($a, $post)
+{
+       if (!local_user() || (! x($_POST, 'fromapp-submit'))) {
                return;
+       }
 
-       set_pconfig(local_user(),'fromapp','app',$_POST['fromapp-input']);
-       set_pconfig(local_user(),'fromapp','force',intval($_POST['fromapp-force']));
+       PConfig::set(local_user(), 'fromapp', 'app', $_POST['fromapp-input']);
+       PConfig::set(local_user(), 'fromapp', 'force', intval($_POST['fromapp-force']));
 
-       info( t('Fromapp settings updated.') . EOL);
+       info(L10n::t('Fromapp settings updated.') . EOL);
 }
 
-function fromapp_settings(&$a,&$s) {
-
-       if(! local_user())
+function fromapp_settings(&$a, &$s)
+{
+       if (!local_user()) {
                return;
+       }
 
        /* Add our stylesheet to the page so we can make our settings look nice */
 
@@ -49,11 +51,9 @@ function fromapp_settings(&$a,&$s) {
 
        /* Get the current state of our config variable */
 
-       $fromapp = get_pconfig(local_user(),'fromapp','app');
-       if($fromapp === false)
-               $fromapp = '';
+       $fromapp = PConfig::get(local_user(), 'fromapp', 'app', '');
 
-       $force = intval(get_pconfig(local_user(),'fromapp','force'));
+       $force = intval(PConfig::get(local_user(), 'fromapp', 'force'));
 
        $force_enabled = (($force) ? ' checked="checked" ' : '');
 
@@ -61,26 +61,25 @@ function fromapp_settings(&$a,&$s) {
        /* Add some HTML to the existing form */
 
        $s .= '<span id="settings_fromapp_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_fromapp_expanded\'); openClose(\'settings_fromapp_inflated\');">';
-       $s .= '<h3>' . t('FromApp Settings') . '</h3>';
+       $s .= '<h3>' . L10n::t('FromApp Settings') . '</h3>';
        $s .= '</span>';
        $s .= '<div id="settings_fromapp_expanded" class="settings-block" style="display: none;">';
        $s .= '<span class="fakelink" onclick="openClose(\'settings_fromapp_expanded\'); openClose(\'settings_fromapp_inflated\');">';
-       $s .= '<h3>' . t('FromApp Settings') . '</h3>';
+       $s .= '<h3>' . L10n::t('FromApp Settings') . '</h3>';
        $s .= '</span>';
        $s .= '<div id="fromapp-wrapper">';
-       $s .= '<label id="fromapp-label" for="fromapp-input">' . t('The application name you would like to show your posts originating from.') . '</label>';
+       $s .= '<label id="fromapp-label" for="fromapp-input">' . L10n::t('The application name you would like to show your posts originating from.') . '</label>';
        $s .= '<input id="fromapp-input" type="text" name="fromapp-input" value="' . $fromapp . '" ' . '/>';
        $s .= '<div class="clear"></div>';
 
-       $s .= '<label id="fromapp-force-label" for="fromapp-force">' . t('Use this application name even if another application was used.') . '</label>';
+       $s .= '<label id="fromapp-force-label" for="fromapp-force">' . L10n::t('Use this application name even if another application was used.') . '</label>';
        $s .= '<input id="fromapp-force" type="checkbox" name="fromapp-force" value="1" ' . $force_enabled . '/>';
 
        $s .= '</div><div class="clear"></div>';
 
        /* provide a submit button */
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="fromapp-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
-
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="fromapp-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 }
 
 function fromapp_post_hook(&$a,&$item) {
index 4d49144619d1aad2fcc9648d267d2db404e01192..983eb6f99ce25926784ab6db651bca6f0f1c569f 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:11+0000\n"
+"PO-Revision-Date: 2017-09-20 06:07+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index 097bac18599b1c4c3a29365a3d9f4692d54ff7e7..b2c9b97f6132afff40738753e440feeb00545bda 100644 (file)
@@ -9,24 +9,32 @@
 
 define('FROMGPLUS_DEFAULT_POLL_INTERVAL', 30); // given in minutes
 
-require_once('mod/share.php');
-require_once('mod/parse_url.php');
-require_once('include/text.php');
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Object\Image;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
+
+require_once 'mod/share.php';
+require_once 'mod/parse_url.php';
+require_once 'include/text.php';
 
 function fromgplus_install() {
-       register_hook('connector_settings', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings');
-       register_hook('connector_settings_post', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings_post');
-       register_hook('cron', 'addon/fromgplus/fromgplus.php', 'fromgplus_cron');
+       Addon::registerHook('connector_settings', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings');
+       Addon::registerHook('connector_settings_post', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings_post');
+       Addon::registerHook('cron', 'addon/fromgplus/fromgplus.php', 'fromgplus_cron');
 }
 
 function fromgplus_uninstall() {
-       unregister_hook('connector_settings', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings');
-       unregister_hook('connector_settings_post', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings_post');
-       unregister_hook('cron', 'addon/fromgplus/fromgplus.php', 'fromgplus_cron');
+       Addon::unregisterHook('connector_settings', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings');
+       Addon::unregisterHook('connector_settings_post', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings_post');
+       Addon::unregisterHook('cron', 'addon/fromgplus/fromgplus.php', 'fromgplus_cron');
 
        // Old hooks
-       unregister_hook('plugin_settings', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings');
-       unregister_hook('plugin_settings_post', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings_post');
+       Addon::unregisterHook('addon_settings', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings_post');
 }
 
 function fromgplus_addon_settings(&$a,&$s) {
@@ -44,27 +52,27 @@ function fromgplus_addon_settings(&$a,&$s) {
        $account = get_pconfig(local_user(),'fromgplus','account');
 
        $s .= '<span id="settings_fromgplus_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_fromgplus_expanded\'); openClose(\'settings_fromgplus_inflated\');">';
-       $s .= '<img class="connector" src="images/googleplus.png" /><h3 class="connector">'. t('Google+ Mirror').'</h3>';
+       $s .= '<img class="connector" src="images/googleplus.png" /><h3 class="connector">'. L10n::t('Google+ Mirror').'</h3>';
        $s .= '</span>';
        $s .= '<div id="settings_fromgplus_expanded" class="settings-block" style="display: none;">';
        $s .= '<span class="fakelink" onclick="openClose(\'settings_fromgplus_expanded\'); openClose(\'settings_fromgplus_inflated\');">';
-       $s .= '<img class="connector" src="images/googleplus.png" /><h3 class="connector">'. t('Google+ Mirror').'</h3>';
+       $s .= '<img class="connector" src="images/googleplus.png" /><h3 class="connector">'. L10n::t('Google+ Mirror').'</h3>';
        $s .= '</span>';
 
        $s .= '<div id="fromgplus-wrapper">';
 
-       $s .= '<label id="fromgplus-enable-label" for="fromgplus-enable">'.t('Enable Google+ Import').'</label>';
+       $s .= '<label id="fromgplus-enable-label" for="fromgplus-enable">'.L10n::t('Enable Google+ Import').'</label>';
        $s .= '<input id="fromgplus-enable" type="checkbox" name="fromgplus-enable" value="1"'.$enable_checked.' />';
        $s .= '<div class="clear"></div>';
-       $s .= '<label id="fromgplus-label" for="fromgplus-account">'.t('Google Account ID').' </label>';
+       $s .= '<label id="fromgplus-label" for="fromgplus-account">'.L10n::t('Google Account ID').' </label>';
        $s .= '<input id="fromgplus-account" type="text" name="fromgplus-account" value="'.$account.'" />';
        $s .= '</div><div class="clear"></div>';
-       $s .= '<label id="fromgplus-keywords-label" for="fromgplus-keywords">'.t('Add keywords to post').'</label>';
+       $s .= '<label id="fromgplus-keywords-label" for="fromgplus-keywords">'.L10n::t('Add keywords to post').'</label>';
        $s .= '<input id="fromgplus-keywords" type="checkbox" name="fromgplus-keywords" value="1"'.$keywords_checked.' />';
        $s .= '<div class="clear"></div>';
 
        $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="fromgplus-submit" name="fromgplus-submit"
-class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
        $s .= '</div>';
 
        return;
@@ -85,23 +93,25 @@ function fromgplus_addon_settings_post(&$a,&$b) {
                if (!$enable)
                        del_pconfig(local_user(),'fromgplus','lastdate');
 
-               info( t('Google+ Import Settings saved.') . EOL);
+               info(L10n::t('Google+ Import Settings saved.') . EOL);
        }
 }
 
-function fromgplus_plugin_admin(&$a, &$o){
-        $t = get_markup_template("admin.tpl", "addon/fromgplus/");
+function fromgplus_addon_admin(&$a, &$o)
+{
+       $t = get_markup_template("admin.tpl", "addon/fromgplus/");
 
-        $o = replace_macros($t, array(
-                '$submit' => t('Save Settings'),
-                '$key' => array('key', t('Key'), trim(get_config('fromgplus', 'key')), t('')),
-        ));
+       $o = replace_macros($t, [
+                       '$submit' => L10n::t('Save Settings'),
+                       '$key' => ['key', L10n::t('Key'), trim(Config::get('fromgplus', 'key')), L10n::t('')],
+       ]);
 }
 
-function fromgplus_plugin_admin_post(&$a){
-        $key = ((x($_POST,'key')) ? trim($_POST['key']) : '');
-        set_config('fromgplus','key',$key);
-        info( t('Settings updated.'). EOL );
+function fromgplus_addon_admin_post(&$a)
+{
+       $key = ((x($_POST, 'key')) ? trim($_POST['key']) : '');
+       Config::set('fromgplus', 'key', $key);
+       info(L10n::t('Settings updated.'). EOL);
 }
 
 function fromgplus_cron($a,$b) {
@@ -305,9 +315,7 @@ function fromgplus_cleantext($text) {
 }
 
 function fromgplus_handleattachments($a, $uid, $item, $displaytext, $shared) {
-       require_once("include/Photo.php");
-       require_once("include/items.php");
-       require_once("include/network.php");
+       require_once 'include/items.php';
 
        $post = "";
        $quote = "";
@@ -318,13 +326,13 @@ function fromgplus_handleattachments($a, $uid, $item, $displaytext, $shared) {
                switch($attachment->objectType) {
                        case "video":
                                $pagedata["type"] = "video";
-                               $pagedata["url"] = original_url($attachment->url);
+                               $pagedata["url"] = Network::finalUrl($attachment->url);
                                $pagedata["title"] = fromgplus_html2bbcode($attachment->displayName);
                                break;
 
                        case "article":
                                $pagedata["type"] = "link";
-                               $pagedata["url"] = original_url($attachment->url);
+                               $pagedata["url"] = Network::finalUrl($attachment->url);
                                $pagedata["title"] = fromgplus_html2bbcode($attachment->displayName);
 
                                $images = fromgplus_cleanupgoogleproxy($attachment->fullImage, $attachment->image);
@@ -373,7 +381,7 @@ function fromgplus_handleattachments($a, $uid, $item, $displaytext, $shared) {
                                break;
 
                        case "photo-album":
-                               $pagedata["url"] = original_url($attachment->url);
+                               $pagedata["url"] = Network::finalUrl($attachment->url);
                                $pagedata["title"] = fromgplus_html2bbcode($attachment->displayName);
                                $post .= "\n\n[bookmark=".$pagedata["url"]."]".$pagedata["title"]."[/bookmark]\n";
 
@@ -394,7 +402,7 @@ function fromgplus_handleattachments($a, $uid, $item, $displaytext, $shared) {
 
                        case "album":
                                $pagedata["type"] = "link";
-                               $pagedata["url"] = original_url($attachment->url);
+                               $pagedata["url"] = Network::finalUrl($attachment->url);
                                $pagedata["title"] = fromgplus_html2bbcode($attachment->displayName);
 
                                $thumb = $attachment->thumbnails[0];
@@ -407,7 +415,7 @@ function fromgplus_handleattachments($a, $uid, $item, $displaytext, $shared) {
                                break;
 
                        case "audio":
-                               $pagedata["url"] = original_url($attachment->url);
+                               $pagedata["url"] = Network::finalUrl($attachment->url);
                                $pagedata["title"] = fromgplus_html2bbcode($attachment->displayName);
                                $post .= "\n\n[bookmark=".$pagedata["url"]."]".$pagedata["title"]."[/bookmark]\n";
                                break;
@@ -432,7 +440,7 @@ function fromgplus_fetch($a, $uid) {
        $account = get_pconfig($uid,'fromgplus','account');
        $key = get_config('fromgplus','key');
 
-       $result = fetch_url("https://www.googleapis.com/plus/v1/people/".$account."/activities/public?alt=json&pp=1&key=".$key."&maxResults=".$maxfetch);
+       $result = Network::fetchUrl("https://www.googleapis.com/plus/v1/people/".$account."/activities/public?alt=json&pp=1&key=".$key."&maxResults=".$maxfetch);
        //$result = file_get_contents("google.txt");
        //file_put_contents("google.txt", $result);
 
@@ -510,12 +518,12 @@ function fromgplus_fetch($a, $uid) {
                                                if (function_exists("share_header"))
                                                        $post .= share_header($item->object->actor->displayName, $item->object->actor->url,
                                                                                $item->object->actor->image->url, "",
-                                                                               datetime_convert('UTC','UTC',$item->object->published),$item->object->url);
+                                                                               DateTimeFormat::utc($item->object->published),$item->object->url);
                                                else
                                                        $post .= "[share author='".str_replace("'", "&#039;",$item->object->actor->displayName).
                                                                        "' profile='".$item->object->actor->url.
                                                                        "' avatar='".$item->object->actor->image->url.
-                                                                       "' posted='".datetime_convert('UTC','UTC',$item->object->published).
+                                                                       "' posted='".DateTimeFormat::utc($item->object->published).
                                                                        "' link='".$item->object->url."']";
 
                                                $post .= fromgplus_html2bbcode($item->object->content);
index d47e5cb645e5f36b53429614d5662336635d9cec..e064622a6aae255bf05f4f850c5715bdda306f33 100644 (file)
@@ -11,7 +11,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2016-11-12 16:52+0000\n"
-"PO-Revision-Date: 2017-01-18 10:38+0000\n"
+"PO-Revision-Date: 2017-09-20 06:07+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index 34f850cb307ddb150c9cc347b0d1e98b9bf1a97c..3c272c9b361370e3c895fa388e834eb3efcf763e 100644 (file)
@@ -5,16 +5,23 @@
  * Version: 0.1
  * Author: Michael Vogel <https://pirati.ca/profile/heluecht>
  */
-
-function geocoordinates_install() {
-       register_hook('post_local', 'addon/geocoordinates/geocoordinates.php', 'geocoordinates_post_hook');
-       register_hook('post_remote', 'addon/geocoordinates/geocoordinates.php', 'geocoordinates_post_hook');
+use Friendica\Core\Addon;
+use Friendica\Core\Cache;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Util\Network;
+
+function geocoordinates_install()
+{
+       Addon::registerHook('post_local', 'addon/geocoordinates/geocoordinates.php', 'geocoordinates_post_hook');
+       Addon::registerHook('post_remote', 'addon/geocoordinates/geocoordinates.php', 'geocoordinates_post_hook');
 }
 
 
-function geocoordinates_uninstall() {
-       unregister_hook('post_local',    'addon/geocoordinates/geocoordinates.php', 'geocoordinates_post_hook');
-       unregister_hook('post_remote',    'addon/geocoordinates/geocoordinates.php', 'geocoordinates_post_hook');
+function geocoordinates_uninstall()
+{
+       Addon::unregisterHook('post_local',    'addon/geocoordinates/geocoordinates.php', 'geocoordinates_post_hook');
+       Addon::unregisterHook('post_remote',    'addon/geocoordinates/geocoordinates.php', 'geocoordinates_post_hook');
 }
 
 function geocoordinates_resolve_item(&$item) {
@@ -43,7 +50,7 @@ function geocoordinates_resolve_item(&$item) {
                return;
        }
 
-       $s = fetch_url("https://api.opencagedata.com/geocode/v1/json?q=".$coords[0].",".$coords[1]."&key=".$key."&language=".$language);
+       $s = Network::fetchUrl("https://api.opencagedata.com/geocode/v1/json?q=".$coords[0].",".$coords[1]."&key=".$key."&language=".$language);
 
        if (!$s) {
                logger("API could not be queried", LOGGER_DEBUG);
@@ -74,22 +81,24 @@ function geocoordinates_post_hook($a, &$item) {
        geocoordinates_resolve_item($item);
 }
 
-function geocoordinates_plugin_admin(&$a,&$o) {
+function geocoordinates_addon_admin(&$a, &$o)
+{
 
        $t = get_markup_template("admin.tpl", "addon/geocoordinates/");
 
-       $o = replace_macros($t, array(
-               '$submit' => t('Save Settings'),
-               '$api_key' => array('api_key', t('API Key'),  get_config('geocoordinates', 'api_key' ), ''),
-               '$language' => array('language', t('Language code (IETF format)'),  get_config('geocoordinates', 'language' ), ''),
-       ));
+       $o = replace_macros($t, [
+               '$submit' => L10n::t('Save Settings'),
+               '$api_key' => ['api_key', L10n::t('API Key'), Config::get('geocoordinates', 'api_key'), ''],
+               '$language' => ['language', L10n::t('Language code (IETF format)'), Config::get('geocoordinates', 'language'), ''],
+       ]);
 }
 
-function geocoordinates_plugin_admin_post(&$a) {
-       $api_key  = ((x($_POST,'api_key')) ? notags(trim($_POST['api_key']))   : '');
-       set_config('geocoordinates','api_key',$api_key);
+function geocoordinates_addon_admin_post(&$a)
+{
+       $api_key  = ((x($_POST, 'api_key')) ? notags(trim($_POST['api_key']))   : '');
+       Config::set('geocoordinates', 'api_key', $api_key);
 
-       $language  = ((x($_POST,'language')) ? notags(trim($_POST['language']))   : '');
-       set_config('geocoordinates','language',$language);
-       info(t('Settings updated.'). EOL);
+       $language  = ((x($_POST, 'language')) ? notags(trim($_POST['language']))   : '');
+       Config::set('geocoordinates', 'language', $language);
+       info(L10n::t('Settings updated.'). EOL);
 }
index c10653a71f7f726c6a3ed11693af2ac3af439243..905dfdc599f7de36b4b0a9ef21d102bb750459e5 100644 (file)
  * $a->config['geonames']['username'] = 'your_username';
  * Also visit http://geonames.org/manageaccount and enable access to the free web services
  *
- * When plugin is installed, the system calls the plugin
+ * When addon is installed, the system calls the addon
  * name_install() function, located in 'addon/name/name.php',
  * where 'name' is the name of the addon.
  * If the addon is removed from the configuration list, the 
  * system will call the name_uninstall() function.
  *
  */
-
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\Network;
+use Friendica\Util\XML;
 
 function geonames_install() {
 
        /**
         * 
-        * Our plugin will attach in three places.
+        * Our addon will attach in three places.
         * The first is just prior to storing a local post.
         *
         */
 
-       register_hook('post_local', 'addon/geonames/geonames.php', 'geonames_post_hook');
+       Addon::registerHook('post_local', 'addon/geonames/geonames.php', 'geonames_post_hook');
 
        /**
         *
-        * Then we'll attach into the plugin settings page, and also the 
+        * Then we'll attach into the addon settings page, and also the 
         * settings post hook so that we can create and update
         * user preferences.
         *
         */
 
-       register_hook('plugin_settings', 'addon/geonames/geonames.php', 'geonames_plugin_admin');
-       register_hook('plugin_settings_post', 'addon/geonames/geonames.php', 'geonames_plugin_admin_post');
+       Addon::registerHook('addon_settings', 'addon/geonames/geonames.php', 'geonames_addon_admin');
+       Addon::registerHook('addon_settings_post', 'addon/geonames/geonames.php', 'geonames_addon_admin_post');
 
        logger("installed geonames");
 }
@@ -57,9 +62,9 @@ function geonames_uninstall() {
         *
         */
 
-       unregister_hook('post_local',    'addon/geonames/geonames.php', 'geonames_post_hook');
-       unregister_hook('plugin_settings', 'addon/geonames/geonames.php', 'geonames_plugin_admin');
-       unregister_hook('plugin_settings_post', 'addon/geonames/geonames.php', 'geonames_plugin_admin_post');
+       Addon::unregisterHook('post_local',    'addon/geonames/geonames.php', 'geonames_post_hook');
+       Addon::unregisterHook('addon_settings', 'addon/geonames/geonames.php', 'geonames_addon_admin');
+       Addon::unregisterHook('addon_settings_post', 'addon/geonames/geonames.php', 'geonames_addon_admin_post');
 
 
        logger("removed geonames");
@@ -74,7 +79,7 @@ function geonames_post_hook($a, &$item) {
         * An item was posted on the local system.
         * We are going to look for specific items:
         *      - A status post by a profile owner
-        *      - The profile owner must have allowed our plugin
+        *      - The profile owner must have allowed our addon
         *
         */
 
@@ -108,12 +113,12 @@ function geonames_post_hook($a, &$item) {
         *
         */
 
-       $s = fetch_url('http://api.geonames.org/findNearbyPlaceName?lat=' . $coords[0] . '&lng=' . $coords[1] . '&username=' . $geo_account);
+       $s = Network::fetchUrl('http://api.geonames.org/findNearbyPlaceName?lat=' . $coords[0] . '&lng=' . $coords[1] . '&username=' . $geo_account);
 
        if(! $s)
                return;
 
-       $xml = parse_xml_string($s);
+       $xml = XML::parseString($s);
 
        if($xml->geoname->name && $xml->geoname->countryName)
                $item['location'] = $xml->geoname->name . ', ' . $xml->geoname->countryName;
@@ -135,25 +140,25 @@ function geonames_post_hook($a, &$item) {
  *
  */
 
-function geonames_plugin_admin_post($a,$post) {
+function geonames_addon_admin_post($a,$post) {
        if(! local_user() || (! x($_POST,'geonames-submit')))
                return;
        set_pconfig(local_user(),'geonames','enable',intval($_POST['geonames']));
 
-       info( t('Geonames settings updated.') . EOL);
+       info(L10n::t('Geonames settings updated.') . EOL);
 }
 
 
 /**
  *
- * Called from the Plugin Setting form. 
+ * Called from the Addon Setting form. 
  * Add our own settings info to the page.
  *
  */
 
 
 
-function geonames_plugin_admin(&$a,&$s) {
+function geonames_addon_admin(&$a,&$s) {
 
        if(! local_user())
                return;
@@ -176,14 +181,14 @@ function geonames_plugin_admin(&$a,&$s) {
        /* Add some HTML to the existing form */
 
        $s .= '<div class="settings-block">';
-       $s .= '<h3>' . t('Geonames Settings') . '</h3>';
+       $s .= '<h3>' . L10n::t('Geonames Settings') . '</h3>';
        $s .= '<div id="geonames-enable-wrapper">';
-       $s .= '<label id="geonames-enable-label" for="geonames-checkbox">' . t('Enable Geonames Plugin') . '</label>';
+       $s .= '<label id="geonames-enable-label" for="geonames-checkbox">' . L10n::t('Enable Geonames Addon') . '</label>';
        $s .= '<input id="geonames-checkbox" type="checkbox" name="geonames" value="1" ' . $checked . '/>';
        $s .= '</div><div class="clear"></div>';
 
        /* provide a submit button */
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="geonames-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="geonames-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
 }
index 49210658ace9aa524f27e8ff299a8114dc5cec9c..81c239d2b896427de88fba72d5caf2bea8fc7d74 100644 (file)
@@ -26,7 +26,7 @@ msgid "Geonames Settings"
 msgstr ""
 
 #: geonames.php:181
-msgid "Enable Geonames Plugin"
+msgid "Enable Geonames Addon"
 msgstr ""
 
 #: geonames.php:187
index 058ef8e5d495d635b572605b198102841d0b7d16..259e81f4e770d58b8971258bc880380d2a7d2abb 100644 (file)
@@ -2,5 +2,5 @@
 \r
 $a->strings["Geonames settings updated."] = "Actualitzada la configuració de Geonames.";\r
 $a->strings["Geonames Settings"] = "Configuració de Geonames";\r
-$a->strings["Enable Geonames Plugin"] = "Habilitar Plugin de Geonames";\r
+$a->strings["Enable Geonames Addon"] = "Habilitar Addon de Geonames";\r
 $a->strings["Submit"] = "Enviar";\r
index d88aef60ba462bb3a5f236f5d47a2a7c519332de..98d8f14f49714b69a19a5a3658a8ed2879945683 100644 (file)
@@ -28,7 +28,7 @@ msgid "Geonames Settings"
 msgstr "Nastavení Geonames"
 
 #: geonames.php:181
-msgid "Enable Geonames Plugin"
+msgid "Enable Geonames Addon"
 msgstr "Povolit Geonames rozšíření"
 
 #: geonames.php:187
index 134a6a77c666b0614e6a86c0fc4a8f202c76d46f..dfd52e6c0f057bc88f01a8ed0696a6691e92e7e8 100644 (file)
@@ -7,5 +7,5 @@ function string_plural_select_cs($n){
 ;
 $a->strings["Geonames settings updated."] = "Geonames nastavení aktualizováno.";
 $a->strings["Geonames Settings"] = "Nastavení Geonames";
-$a->strings["Enable Geonames Plugin"] = "Povolit Geonames rozšíření";
+$a->strings["Enable Geonames Addon"] = "Povolit Geonames rozšíření";
 $a->strings["Submit"] = "Odeslat";
index 7629b1b5e07c53aab49459dcb28db8dab94a7917..fdc3ed632c08a9831dbc266dfe16a7877cde6774 100644 (file)
@@ -29,8 +29,8 @@ msgid "Geonames Settings"
 msgstr "Geonames Einstellungen"
 
 #: geonames.php:181
-msgid "Enable Geonames Plugin"
-msgstr "Geonames Plugin aktivieren"
+msgid "Enable Geonames Addon"
+msgstr "Geonames Addon aktivieren"
 
 #: geonames.php:187
 msgid "Submit"
index cf1838fb08ad9b848fcd2097e0b058e95ff4cb36..26f2246e678231f01212b8d39d4d10604bf3ab94 100644 (file)
@@ -7,5 +7,5 @@ function string_plural_select_de($n){
 ;
 $a->strings["Geonames settings updated."] = "Geonames Einstellungen aktualisiert";
 $a->strings["Geonames Settings"] = "Geonames Einstellungen";
-$a->strings["Enable Geonames Plugin"] = "Geonames Plugin aktivieren";
+$a->strings["Enable Geonames Addon"] = "Geonames Addon aktivieren";
 $a->strings["Submit"] = "Senden";
index a6127e68400dc42f0d12adcc6916034f960d7811..65cd16a3b13f90002dc03ecf098c71cc88026d56 100644 (file)
@@ -2,5 +2,5 @@
 \r
 $a->strings["Geonames settings updated."] = "Ĝidatigis la Geonames agordojn.";\r
 $a->strings["Geonames Settings"] = "Geonames Agordoj";\r
-$a->strings["Enable Geonames Plugin"] = "Ŝalti la Geonames Kromprogramon";\r
+$a->strings["Enable Geonames Addon"] = "Ŝalti la Geonames Kromprogramon";\r
 $a->strings["Submit"] = "Sendi";\r
index f372d7925057cdaada452054933f9436e77c7986..84de85aae5ba3e7583469ee1766ab5be533d4500 100644 (file)
@@ -28,8 +28,8 @@ msgid "Geonames Settings"
 msgstr "Ajustes de Geonombres"
 
 #: geonames.php:181
-msgid "Enable Geonames Plugin"
-msgstr "Habilitar Plugin de Geonombres"
+msgid "Enable Geonames Addon"
+msgstr "Habilitar Addon de Geonombres"
 
 #: geonames.php:187
 msgid "Submit"
index d9a85aa16858e0d1a757563b935a2106fbfc6c94..d2cb635d7a09f87624c114f179a6c320e5c10d84 100644 (file)
@@ -7,5 +7,5 @@ function string_plural_select_es($n){
 ;
 $a->strings["Geonames settings updated."] = "Ajustes de geonombres actualizados.";
 $a->strings["Geonames Settings"] = "Ajustes de Geonombres";
-$a->strings["Enable Geonames Plugin"] = "Habilitar Plugin de Geonombres";
+$a->strings["Enable Geonames Addon"] = "Habilitar Addon de Geonombres";
 $a->strings["Submit"] = "Enviar";
index 6428cb38bad6303667b5eec8476f72cdb16e4b16..10d6631eb15a4a8ccf26f7e43abb7c45e918c85f 100644 (file)
@@ -2,5 +2,5 @@
 \r
 $a->strings["Geonames settings updated."] = "Réglages Geonames sauvés.";\r
 $a->strings["Geonames Settings"] = "Réglages Geonames";\r
-$a->strings["Enable Geonames Plugin"] = "Activer Geonames";\r
+$a->strings["Enable Geonames Addon"] = "Activer Geonames";\r
 $a->strings["Submit"] = "Envoyer";\r
index ac64f2babad71c5a56ad1c69a4b145fff561bfcf..436d31167b7e93adc441d4bdb62cce3f3447d127 100644 (file)
@@ -2,5 +2,5 @@
 \r
 $a->strings["Geonames settings updated."] = "";\r
 $a->strings["Geonames Settings"] = "";\r
-$a->strings["Enable Geonames Plugin"] = "";\r
+$a->strings["Enable Geonames Addon"] = "";\r
 $a->strings["Submit"] = "Senda inn";\r
index 8164d7a24a0e95c3f2ee3bbe1c5340de3dd668e5..f186dd42e27b6e871045f60d0514d68bccde9072 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:12+0000\n"
+"PO-Revision-Date: 2018-03-19 13:22+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -28,8 +28,8 @@ msgid "Geonames Settings"
 msgstr "Impostazioni Geonames"
 
 #: geonames.php:181
-msgid "Enable Geonames Plugin"
-msgstr "Abilita plugin Geonames"
+msgid "Enable Geonames Addon"
+msgstr "Abilita componente aggiuntivo Geonames"
 
 #: geonames.php:187
 msgid "Submit"
index 8ecc98c2208454c8f71aac62aa1470eaff1453b2..33148f6ba932cb14b8911961f179741f0c6e2bb2 100644 (file)
@@ -7,5 +7,5 @@ function string_plural_select_it($n){
 ;
 $a->strings["Geonames settings updated."] = "Impostazioni di Geonames aggiornate.";
 $a->strings["Geonames Settings"] = "Impostazioni Geonames";
-$a->strings["Enable Geonames Plugin"] = "Abilita plugin Geonames";
+$a->strings["Enable Geonames Addon"] = "Abilita componente aggiuntivo Geonames";
 $a->strings["Submit"] = "Invia";
index b3fea872a3924a5a1bff6c179510f917176f1d1d..4a7b5f09f60c66a445b9ee2171a51ca9655d8f8f 100644 (file)
@@ -2,5 +2,5 @@
 \r
 $a->strings["Geonames settings updated."] = "";\r
 $a->strings["Geonames Settings"] = "";\r
-$a->strings["Enable Geonames Plugin"] = "";\r
+$a->strings["Enable Geonames Addon"] = "";\r
 $a->strings["Submit"] = "Lagre";\r
index ff15d74fe7b65890e9c4f2c0802988f09e0530af..08a3633c6d40a96a3e28755f128709e0c8e442bf 100644 (file)
@@ -2,5 +2,5 @@
 \r
 $a->strings["Geonames settings updated."] = "";\r
 $a->strings["Geonames Settings"] = "ustawienia Geonames";\r
-$a->strings["Enable Geonames Plugin"] = "";\r
+$a->strings["Enable Geonames Addon"] = "";\r
 $a->strings["Submit"] = "Potwierdź";\r
index c0cf0b5381205f5a2c3ecded8d34e53cd6cfd2c3..d302d1fe3111ff69aba5991ca206c31ed2576801 100644 (file)
@@ -2,5 +2,5 @@
 \r
 $a->strings["Geonames settings updated."] = "Configurações Geonames atualizadas.";\r
 $a->strings["Geonames Settings"] = "Configurações Geonames";\r
-$a->strings["Enable Geonames Plugin"] = "Plugin Geonames Habilitado";\r
+$a->strings["Enable Geonames Addon"] = "Addon Geonames Habilitado";\r
 $a->strings["Submit"] = "Enviar";\r
index 673f4fdfdb5e7228241c716278013d54d1a93e67..973c9446f21a1d695f125f9e935a3fc49f42b98d 100644 (file)
@@ -28,7 +28,7 @@ msgid "Geonames Settings"
 msgstr "Configurări Geonume"
 
 #: geonames.php:181
-msgid "Enable Geonames Plugin"
+msgid "Enable Geonames Addon"
 msgstr "Permite Modul Geonume"
 
 #: geonames.php:187
index 6b25f12f31286d092ee77f8dd9e54a2580c1e359..b625855271f04527396763f1c8b93eaaf6f136fe 100644 (file)
@@ -7,5 +7,5 @@ function string_plural_select_ro($n){
 ;
 $a->strings["Geonames settings updated."] = "Configurări Geonume actualizate.";
 $a->strings["Geonames Settings"] = "Configurări Geonume";
-$a->strings["Enable Geonames Plugin"] = "Permite Modul Geonume";
+$a->strings["Enable Geonames Addon"] = "Permite Modul Geonume";
 $a->strings["Submit"] = "Trimite";
index d8deda8c1da7efdac26108290bb690a51083a0d5..a639310bc7e26e5e2b932d80618fc19d4c391cdd 100644 (file)
@@ -28,7 +28,7 @@ msgid "Geonames Settings"
 msgstr "Настройки Geonames"
 
 #: geonames.php:181
-msgid "Enable Geonames Plugin"
+msgid "Enable Geonames Addon"
 msgstr "Включить плагин Geonames"
 
 #: geonames.php:187
index 2af0233ca63e5b28a2fd3bd3868c8f032db36a49..658dd72a866153f65bd81f33fdbc4178773ec5fd 100644 (file)
@@ -7,5 +7,5 @@ function string_plural_select_ru($n){
 ;
 $a->strings["Geonames settings updated."] = "Настройки Geonames обновлены.";
 $a->strings["Geonames Settings"] = "Настройки Geonames";
-$a->strings["Enable Geonames Plugin"] = "Включить плагин Geonames";
+$a->strings["Enable Geonames Addon"] = "Включить плагин Geonames";
 $a->strings["Submit"] = "Добавить";
index 2f72f8c00962215be24bce4620eae244c885d11e..89e3fd943f67286bc1885915e88e855df668e193 100644 (file)
@@ -2,5 +2,5 @@
 \r
 $a->strings["Geonames settings updated."] = "Geonames设置更新了。";\r
 $a->strings["Geonames Settings"] = "Geonames设置";\r
-$a->strings["Enable Geonames Plugin"] = "使Geonames插件能用";\r
+$a->strings["Enable Geonames Addon"] = "使Geonames插件能用";\r
 $a->strings["Submit"] = "提交";\r
index fcdc7319f1520205258a55ace1f84e27558c0693..87d28063b591ac29589b61f8c73e99a0c8fc881c 100644 (file)
@@ -7,13 +7,15 @@
  * 
  *
  */
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 function gnot_install() {
 
-       register_hook('plugin_settings', 'addon/gnot/gnot.php', 'gnot_settings');
-       register_hook('plugin_settings_post', 'addon/gnot/gnot.php', 'gnot_settings_post');
-       register_hook('enotify_mail', 'addon/gnot/gnot.php', 'gnot_enotify_mail');
+       Addon::registerHook('addon_settings', 'addon/gnot/gnot.php', 'gnot_settings');
+       Addon::registerHook('addon_settings_post', 'addon/gnot/gnot.php', 'gnot_settings_post');
+       Addon::registerHook('enotify_mail', 'addon/gnot/gnot.php', 'gnot_enotify_mail');
 
        logger("installed gnot");
 }
@@ -21,9 +23,9 @@ function gnot_install() {
 
 function gnot_uninstall() {
 
-       unregister_hook('plugin_settings', 'addon/gnot/gnot.php', 'gnot_settings');
-       unregister_hook('plugin_settings_post', 'addon/gnot/gnot.php', 'gnot_settings_post');
-       unregister_hook('enotify_mail', 'addon/gnot/gnot.php', 'gnot_enotify_mail');
+       Addon::unregisterHook('addon_settings', 'addon/gnot/gnot.php', 'gnot_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/gnot/gnot.php', 'gnot_settings_post');
+       Addon::unregisterHook('enotify_mail', 'addon/gnot/gnot.php', 'gnot_enotify_mail');
 
 
        logger("removed gnot");
@@ -44,14 +46,14 @@ function gnot_settings_post($a,$post) {
        if(! local_user() || (! x($_POST,'gnot-submit')))
                return;
 
-       set_pconfig(local_user(),'gnot','enable',intval($_POST['gnot']));
-       info( t('Gnot settings updated.') . EOL);
+       PConfig::set(local_user(),'gnot','enable',intval($_POST['gnot']));
+       info(L10n::t('Gnot settings updated.') . EOL);
 }
 
 
 /**
  *
- * Called from the Plugin Setting form. 
+ * Called from the Addon Setting form. 
  * Add our own settings info to the page.
  *
  */
@@ -76,16 +78,16 @@ function gnot_settings(&$a,&$s) {
        /* Add some HTML to the existing form */
 
        $s .= '<div class="settings-block">';
-       $s .= '<h3>' . t('Gnot Settings') . '</h3>';
+       $s .= '<h3>' . L10n::t('Gnot Settings') . '</h3>';
        $s .= '<div id="gnot-wrapper">';
-       $s .= '<div id="gnot-desc">' . t("Allows threading of email comment notifications on Gmail and anonymising the subject line.") . '</div>';
-       $s .= '<label id="gnot-label" for="gnot">' . t('Enable this plugin/addon?') . '</label>';
+       $s .= '<div id="gnot-desc">' . L10n::t("Allows threading of email comment notifications on Gmail and anonymising the subject line.") . '</div>';
+       $s .= '<label id="gnot-label" for="gnot">' . L10n::t('Enable this addon?') . '</label>';
        $s .= '<input id="gnot-input" type="checkbox" name="gnot" value="1"'.  $gnot_checked . '/>';
        $s .= '</div><div class="clear"></div>';
 
        /* provide a submit button */
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="gnot-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="gnot-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
 }
 
@@ -94,6 +96,5 @@ function gnot_enotify_mail(&$a,&$b) {
        if((! $b['uid']) || (! intval(get_pconfig($b['uid'], 'gnot','enable'))))
                return;
        if($b['type'] == NOTIFY_COMMENT)
-               $b['subject'] = sprintf( t('[Friendica:Notify] Comment to conversation #%d'), $b['parent']);
+               $b['subject'] = L10n::t('[Friendica:Notify] Comment to conversation #%d', $b['parent']);
 }
-
index 86f2268c1a109c554e66126ae22df325c5e53789..230d2364b1d75e5192b8457b13d3bf43202482dd 100644 (file)
@@ -32,7 +32,7 @@ msgid ""
 msgstr ""
 
 #: gnot.php:82
-msgid "Enable this plugin/addon?"
+msgid "Enable this addon?"
 msgstr ""
 
 #: gnot.php:88
index 809a152df1bd47fd075140071e9a40d3203866f6..e65ec9365d552dddf3068fd11076e31bfdeb4d7e 100644 (file)
@@ -3,6 +3,6 @@
 $a->strings["Gnot settings updated."] = "Configuració de Gnot actualitzada";\r
 $a->strings["Gnot Settings"] = "Configuració de Gnot";\r
 $a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Permet crear fils de les notificacions de comentaris de correu electrònic a Gmail i anonimat de la línia d'assumpte.";\r
-$a->strings["Enable this plugin/addon?"] = "Activar aquest plugin/aplicació?";\r
+$a->strings["Enable this addon?"] = "Activar aquest addon/aplicació?";\r
 $a->strings["Submit"] = "Enviar";\r
 $a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica: Notifica] Conversació comentada #%d";\r
index 3db9fa475457d0cbc34f2962843a7c4a5dac853e..1f9f4244a2e40a801774f6689ef62e2669acc8b4 100644 (file)
@@ -34,8 +34,8 @@ msgid ""
 msgstr "Umožnit řetězení emailových komentářových notifikací na Gmailu a anonymizací řádky předmětu."
 
 #: gnot.php:82
-msgid "Enable this plugin/addon?"
-msgstr "Povolit tento plugin/rozšíření?"
+msgid "Enable this addon?"
+msgstr "Povolit tento addon/rozšíření?"
 
 #: gnot.php:88
 msgid "Submit"
index 596817d1e18e99aad9505994986f5f9816dc8a33..90648e5e57a41f062b7307dc0555dca4c675b205 100644 (file)
@@ -8,6 +8,6 @@ function string_plural_select_cs($n){
 $a->strings["Gnot settings updated."] = "Nastavení Gnot aktualizováno.";
 $a->strings["Gnot Settings"] = "Nastavení Gnot";
 $a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Umožnit řetězení emailových komentářových notifikací na Gmailu a anonymizací řádky předmětu.";
-$a->strings["Enable this plugin/addon?"] = "Povolit tento plugin/rozšíření?";
+$a->strings["Enable this addon?"] = "Povolit tento addon/rozšíření?";
 $a->strings["Submit"] = "Odeslat";
 $a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Upozornění] Komentář ke konverzaci #%d";
index 3a72154d0944c15205b097f8924af0c7e3e87ffa..747f1853e2c76713c422db6f709da34d794b1029 100644 (file)
@@ -35,8 +35,8 @@ msgid ""
 msgstr "Erlaubt das Veröffentlichen von E-Mail Kommentar Benachrichtigungen bei Gmail mit anonymisiertem Betreff"
 
 #: gnot.php:82
-msgid "Enable this plugin/addon?"
-msgstr "Dieses Plugin/Addon aktivieren?"
+msgid "Enable this addon?"
+msgstr "Dieses Addon aktivieren?"
 
 #: gnot.php:88
 msgid "Submit"
index 03832f71a3ee75e9e613e55997efbd9ae9e07e52..b798a21b94c803b670d02d8e454da3639875b64c 100644 (file)
@@ -8,6 +8,6 @@ function string_plural_select_de($n){
 $a->strings["Gnot settings updated."] = "Gnot Einstellungen aktualisiert.";
 $a->strings["Gnot Settings"] = "Gnot Einstellungen";
 $a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Erlaubt das Veröffentlichen von E-Mail Kommentar Benachrichtigungen bei Gmail mit anonymisiertem Betreff";
-$a->strings["Enable this plugin/addon?"] = "Dieses Plugin/Addon aktivieren?";
+$a->strings["Enable this addon?"] = "Dieses Addon aktivieren?";
 $a->strings["Submit"] = "Senden";
 $a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica-Benachrichtigung] Kommentar zum Beitrag #%d";
index 89379e9aac995fbf4f57e1caee621b056559e283..cfd3c53cc8588d03ceb44d8747cdde5ef037b3ef 100644 (file)
@@ -3,6 +3,6 @@
 $a->strings["Gnot settings updated."] = "Ĝisdatigis Gnot agordojn.";\r
 $a->strings["Gnot Settings"] = "Agordoj por Gnot";\r
 $a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Permesas la ĉenadon de retpoŝtaj atentigoj pri komentoj ĉe Gmail kan anonimigado de la temlinio.";\r
-$a->strings["Enable this plugin/addon?"] = "Ŝalti tiun kromprogramon?";\r
+$a->strings["Enable this addon?"] = "Ŝalti tiun kromprogramon?";\r
 $a->strings["Submit"] = "Sendi";\r
 $a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Atentigo] Komento pri konversacio #%d";\r
index b96abe64275232c1963f1162043df0ae39558d1d..6e4b85690b234ddbbbe033c5afd02eaab060f6d5 100644 (file)
@@ -34,8 +34,8 @@ msgid ""
 msgstr "Permite limpiar las notificaciones de comentario de email en Gmail y anonimizar la línea del tema."
 
 #: gnot.php:82
-msgid "Enable this plugin/addon?"
-msgstr "¿Habilitar este plugin/addon?"
+msgid "Enable this addon?"
+msgstr "¿Habilitar este addon?"
 
 #: gnot.php:88
 msgid "Submit"
index 1f114cdb97c3f4a4da86c3c1ad873a1ec4a200bb..2f9e7a8d4c23908c835eb31df29780db179c9ce3 100644 (file)
@@ -8,6 +8,6 @@ function string_plural_select_es($n){
 $a->strings["Gnot settings updated."] = "Ajustes de Gnot actualizados.";
 $a->strings["Gnot Settings"] = "Ajustes de Gnot";
 $a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Permite limpiar las notificaciones de comentario de email en Gmail y anonimizar la línea del tema.";
-$a->strings["Enable this plugin/addon?"] = "¿Habilitar este plugin/addon?";
+$a->strings["Enable this addon?"] = "¿Habilitar este addon?";
 $a->strings["Submit"] = "Enviar";
 $a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Notify] Comentar en conversación #%d";
index 7018f6c3fe343e67ce64d80493fad19f7f52f682..32caf46bae67f1e00cd7034f543b64092bf392bc 100644 (file)
@@ -3,6 +3,6 @@
 $a->strings["Gnot settings updated."] = "Réglages Gnot sauvés.";\r
 $a->strings["Gnot Settings"] = "Réglages Gnot";\r
 $a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Autorise l'arborescence des notifications de commentaires sur GMail, et rend la ligne 'Sujet' anonyme.";\r
-$a->strings["Enable this plugin/addon?"] = "Activer cette extension?";\r
+$a->strings["Enable this addon?"] = "Activer cette extension?";\r
 $a->strings["Submit"] = "Envoyer";\r
 $a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Notification] Commentaire sur la conversation #%d";\r
index c75a1c42c66bf508596a19bf566f0f2ffa156c2b..ae183568a91b6c748baf1f26f1d411c5736b8f21 100644 (file)
@@ -3,6 +3,6 @@
 $a->strings["Gnot settings updated."] = "";\r
 $a->strings["Gnot Settings"] = "";\r
 $a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "";\r
-$a->strings["Enable this plugin/addon?"] = "";\r
+$a->strings["Enable this addon?"] = "";\r
 $a->strings["Submit"] = "Senda inn";\r
 $a->strings["[Friendica:Notify] Comment to conversation #%d"] = "";\r
index 45649f78d0e339b253c1ee5990f057242c130b94..4c200ede1a0e88e46a57244f93eac7044a87120f 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:12+0000\n"
+"PO-Revision-Date: 2018-03-19 13:22+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -34,8 +34,8 @@ msgid ""
 msgstr "Permetti di raggruppare le notifiche dei commenti in thread su Gmail e anonimizza l'oggetto"
 
 #: gnot.php:82
-msgid "Enable this plugin/addon?"
-msgstr "Abilita questo plugin?"
+msgid "Enable this addon?"
+msgstr "Abilita questo componente aggiuntivo?"
 
 #: gnot.php:88
 msgid "Submit"
index 0c8ef482c4521e4ce988b7788f0f580401223df0..c38bac29b39a2be092da25d70e3269a74ec470d1 100644 (file)
@@ -8,6 +8,6 @@ function string_plural_select_it($n){
 $a->strings["Gnot settings updated."] = "Impostazioni di \"Gnot\" aggiornate.";
 $a->strings["Gnot Settings"] = "Impostazioni Gnot";
 $a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Permetti di raggruppare le notifiche dei commenti in thread su Gmail e anonimizza l'oggetto";
-$a->strings["Enable this plugin/addon?"] = "Abilita questo plugin?";
+$a->strings["Enable this addon?"] = "Abilita questo componente aggiuntivo?";
 $a->strings["Submit"] = "Invia";
 $a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Notifica] Commento alla conversazione n° %d";
index d53d82969fda6b87c6bb64b0e1ed8c86c4955e62..4d260d6bb7658bb9966a642c24534edaeb094314 100644 (file)
@@ -3,6 +3,6 @@
 $a->strings["Gnot settings updated."] = "";\r
 $a->strings["Gnot Settings"] = "";\r
 $a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "";\r
-$a->strings["Enable this plugin/addon?"] = "";\r
+$a->strings["Enable this addon?"] = "";\r
 $a->strings["Submit"] = "Lagre";\r
 $a->strings["[Friendica:Notify] Comment to conversation #%d"] = "";\r
index 64d9ef8b37c0b17e3477c23d8febef3ed56396e1..fb58666ef0b6ffad74665bab6804880ad11e3269 100644 (file)
@@ -3,6 +3,6 @@
 $a->strings["Gnot settings updated."] = "";\r
 $a->strings["Gnot Settings"] = "";\r
 $a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "";\r
-$a->strings["Enable this plugin/addon?"] = "Umożliwić tego plugina/wtyczkę?";\r
+$a->strings["Enable this addon?"] = "Umożliwić tego addona/wtyczkę?";\r
 $a->strings["Submit"] = "Potwierdź";\r
 $a->strings["[Friendica:Notify] Comment to conversation #%d"] = "";\r
index 5a0791546b4954f2c1347d2eba0e8ce2b265020c..92c97c4b3388e373a68b04d13b2352eb43fb78fc 100644 (file)
@@ -3,6 +3,6 @@
 $a->strings["Gnot settings updated."] = "As configurações do Gnot foram atualizadas.";\r
 $a->strings["Gnot Settings"] = "Configurações do Gnot";\r
 $a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Permite o encadeamento das notificações por e-mail de comentário no GMail, tornando a a linha de assunto anônima.";\r
-$a->strings["Enable this plugin/addon?"] = "Habilitar este plugin/complemento?";\r
+$a->strings["Enable this addon?"] = "Habilitar este addon/complemento?";\r
 $a->strings["Submit"] = "Enviar";\r
 $a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Notify] Comentário na conversa #%d";\r
index 807f2977bed09d4dac45f80a332835f7481064c8..34de34f8eaa97b4d3d838c5a23388911ae78fbf9 100644 (file)
@@ -34,7 +34,7 @@ msgid ""
 msgstr "Permite înlănțuirea notificărilor prin email a comentariilor, în Gmail și anonimizarea  subiectului."
 
 #: gnot.php:82
-msgid "Enable this plugin/addon?"
+msgid "Enable this addon?"
 msgstr "Activați acest modul/supliment?"
 
 #: gnot.php:88
index 764be84e0510314f1062c437631a2603a994cad1..a3641f4e5e5b67d6f3cfca97b0e0314104069e13 100644 (file)
@@ -8,6 +8,6 @@ function string_plural_select_ro($n){
 $a->strings["Gnot settings updated."] = "Configurările Gnot au fost actualizate.";
 $a->strings["Gnot Settings"] = "Configurări Gnot";
 $a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Permite înlănțuirea notificărilor prin email a comentariilor, în Gmail și anonimizarea  subiectului.";
-$a->strings["Enable this plugin/addon?"] = "Activați acest modul/supliment?";
+$a->strings["Enable this addon?"] = "Activați acest modul/supliment?";
 $a->strings["Submit"] = "Trimite";
 $a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Notificare] Comentariu la conversația # %d";
index ff2dc4601c69f79d7c6c4bfccc765d98a761c27f..9e63af41925d24bca44e62b1b1416969b28c82df 100644 (file)
@@ -34,7 +34,7 @@ msgid ""
 msgstr "Разрешить нитевание уведомлений о комментариях на Gmail и анонимизировать поле \"Тема\"."
 
 #: gnot.php:82
-msgid "Enable this plugin/addon?"
+msgid "Enable this addon?"
 msgstr "Включить этот плагин/аддон?"
 
 #: gnot.php:88
index 45510f700792a36ff205f46abaea59146bd44ede..53d6583b2d6ebd9c21f51a3287b6ccd410f1f2be 100644 (file)
@@ -8,6 +8,6 @@ function string_plural_select_ru($n){
 $a->strings["Gnot settings updated."] = "Настройки Gnot обновлены.";
 $a->strings["Gnot Settings"] = "Настройки Gnot";
 $a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Разрешить нитевание уведомлений о комментариях на Gmail и анонимизировать поле \"Тема\".";
-$a->strings["Enable this plugin/addon?"] = "Включить этот плагин/аддон?";
+$a->strings["Enable this addon?"] = "Включить этот плагин/аддон?";
 $a->strings["Submit"] = "Добавить";
 $a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Notify] Комментарий в теме #%d";
index ddb0d85da5877695fb6e05815d6452e4d6b4b396..3f7ba8f911473b2ac1219134cf6dba812ed890aa 100644 (file)
@@ -3,6 +3,6 @@
 $a->strings["Gnot settings updated."] = "Gnot设置更新了。";\r
 $a->strings["Gnot Settings"] = "Gnot设置";\r
 $a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "允许邮件评论通知在Gmail和匿名话题行。";\r
-$a->strings["Enable this plugin/addon?"] = "使这个插件/加件可用?";\r
+$a->strings["Enable this addon?"] = "使这个插件/加件可用?";\r
 $a->strings["Submit"] = "提交";\r
 $a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Notify]评论在交流#%d";\r
index 0b031f4da215b6ce10a1a07f43d4d4be94d34970..1a2a974f34aedce312560a598f33cf9c9ebce56b 100644 (file)
@@ -6,18 +6,19 @@
  * Author: Michael Vogel <https://pirati.ca/profile/heluecht>
  *
  */
+use Friendica\Core\Addon;
+use Friendica\Core\Cache;
 
-require_once('include/cache.php');
-
-
-function googlemaps_install() {
-       register_hook('render_location', 'addon/googlemaps/googlemaps.php', 'googlemaps_location');
+function googlemaps_install()
+{
+       Addon::registerHook('render_location', 'addon/googlemaps/googlemaps.php', 'googlemaps_location');
 
        logger("installed googlemaps");
 }
 
-function googlemaps_uninstall() {
-       unregister_hook('render_location', 'addon/googlemaps/googlemaps.php', 'googlemaps_location');
+function googlemaps_uninstall()
+{
+       Addon::unregisterHook('render_location', 'addon/googlemaps/googlemaps.php', 'googlemaps_location');
 
        logger("removed googlemaps");
 }
index ff209b0e008c7959d1702b01aceb4efdd75129b7..0145570b79506277e612bae0726a207f3695ffe4 100644 (file)
@@ -1,4 +1,4 @@
-# Gravatar Plugin
+# Gravatar Addon
 by [Klaus Weidenbach](http://friendica.dszdw.net/profile/klaus)
 
 This addon allows you to look up an avatar image for new users and contacts at [Gravatar](http://www.gravatar.com). This will be used if there have not been found any other avatar images yet for example through OpenID.
index eb38db78f6cc3859ac37d962c87c4c2c111a2c93..88db743b751b461e9696b6d2430323be10439535 100644 (file)
@@ -1,25 +1,28 @@
 <?php
 /**
  * Name: Gravatar Support
- * Description: If there is no avatar image for a new user or contact this plugin will look for one at Gravatar.
+ * Description: If there is no avatar image for a new user or contact this addon will look for one at Gravatar.
  * Version: 1.1
  * Author: Klaus Weidenbach <http://friendica.dszdw.net/profile/klaus>
  */
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
 
 /**
- * Installs the plugin hook
+ * Installs the addon hook
  */
 function gravatar_install() {
-       register_hook('avatar_lookup', 'addon/gravatar/gravatar.php', 'gravatar_lookup');
+       Addon::registerHook('avatar_lookup', 'addon/gravatar/gravatar.php', 'gravatar_lookup');
 
        logger("registered gravatar in avatar_lookup hook");
 }
 
 /**
- * Removes the plugin hook
+ * Removes the addon hook
  */
 function gravatar_uninstall() {
-       unregister_hook('avatar_lookup', 'addon/gravatar/gravatar.php', 'gravatar_lookup');
+       Addon::unregisterHook('avatar_lookup', 'addon/gravatar/gravatar.php', 'gravatar_lookup');
 
        logger("unregistered gravatar in avatar_lookup hook");
 }
@@ -54,7 +57,7 @@ function gravatar_lookup($a, &$b) {
 /**
  * Display admin settings for this addon
  */
-function gravatar_plugin_admin (&$a, &$o) {
+function gravatar_addon_admin (&$a, &$o) {
        $t = get_markup_template( "admin.tpl", "addon/gravatar/" );
 
        $default_avatar = get_config('gravatar', 'default_img');
@@ -67,14 +70,14 @@ function gravatar_plugin_admin (&$a, &$o) {
                $rating = 'g'; // suitable for display on all websites with any audience type
 
        // Available options for the select boxes
-       $default_avatars = array(
-               'mm' => t('generic profile image'),
-               'identicon' => t('random geometric pattern'),
-               'monsterid' => t('monster face'),
-               'wavatar' => t('computer generated face'),
-               'retro' => t('retro arcade style face'),
-       );
-       $ratings = array(
+       $default_avatars = [
+               'mm' => L10n::t('generic profile image'),
+               'identicon' => L10n::t('random geometric pattern'),
+               'monsterid' => L10n::t('monster face'),
+               'wavatar' => L10n::t('computer generated face'),
+               'retro' => L10n::t('retro arcade style face'),
+       ];
+       $ratings = [
                'g' => 'g',
                'pg' => 'pg',
                'r' => 'r',
@@ -86,28 +89,27 @@ function gravatar_plugin_admin (&$a, &$o) {
                dbesc('libravatar')
        );
        if (count($r)) {
-               $o = '<h5>' .t('Information') .'</h5><p>' .t('Libravatar addon is installed, too. Please disable Libravatar addon or this Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar.') .'</p><br><br>';
+               $o = '<h5>' .L10n::t('Information') .'</h5><p>' .L10n::t('Libravatar addon is installed, too. Please disable Libravatar addon or this Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar.') .'</p><br><br>';
        }
 
        // output Gravatar settings
        $o .= '<input type="hidden" name="form_security_token" value="' .get_form_security_token("gravatarsave") .'">';
-       $o .= replace_macros( $t, array(
-               '$submit' => t('Save Settings'),
-               '$default_avatar' => array('avatar', t('Default avatar image'), $default_avatar, t('Select default avatar image if none was found at Gravatar. See README'), $default_avatars),
-               '$rating' => array('rating', t('Rating of images'), $rating, t('Select the appropriate avatar rating for your site. See README'), $ratings),
-       ));
+       $o .= replace_macros( $t, [
+               '$submit' => L10n::t('Save Settings'),
+               '$default_avatar' => ['avatar', L10n::t('Default avatar image'), $default_avatar, L10n::t('Select default avatar image if none was found at Gravatar. See README'), $default_avatars],
+               '$rating' => ['rating', L10n::t('Rating of images'), $rating, L10n::t('Select the appropriate avatar rating for your site. See README'), $ratings],
+       ]);
 }
 
 /**
  * Save admin settings
  */
-function gravatar_plugin_admin_post (&$a) {
+function gravatar_addon_admin_post (&$a) {
        check_form_security_token('gravatarsave');
 
        $default_avatar = ((x($_POST, 'avatar')) ? notags(trim($_POST['avatar'])) : 'identicon');
        $rating = ((x($_POST, 'rating')) ? notags(trim($_POST['rating'])) : 'g');
-       set_config('gravatar', 'default_img', $default_avatar);
-       set_config('gravatar', 'rating', $rating);
-       info( t('Gravatar settings updated.') .EOL);
+       Config::set('gravatar', 'default_img', $default_avatar);
+       Config::set('gravatar', 'rating', $rating);
+       info(L10n::t('Gravatar settings updated.') .EOL);
 }
-?>
index 589b0e4aced918c95da166c92348c22ae28303b2..d1a867a64aed2b24baf54b569fb2f4775147fb75 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:12+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index 29b0675feec933bed4b033519b778f036fdbbd24..d07d8aa56bcbb3f0517537cd30034acfc41c02db 100644 (file)
@@ -4,15 +4,15 @@
  * Description: Disable images in group edit menu
  * Version: 1.0
  * Author: Thomas Willingham <https://kakste.com/profile/beardyunixer>
- * 
- *
  */
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 function group_text_install() {
 
-       register_hook('plugin_settings', 'addon/group_text/group_text.php', 'group_text_settings');
-       register_hook('plugin_settings_post', 'addon/group_text/group_text.php', 'group_text_settings_post');
+       Addon::registerHook('addon_settings', 'addon/group_text/group_text.php', 'group_text_settings');
+       Addon::registerHook('addon_settings_post', 'addon/group_text/group_text.php', 'group_text_settings_post');
 
        logger("installed group_text");
 }
@@ -20,8 +20,8 @@ function group_text_install() {
 
 function group_text_uninstall() {
 
-       unregister_hook('plugin_settings', 'addon/group_text/group_text.php', 'group_text_settings');
-       unregister_hook('plugin_settings_post', 'addon/group_text/group_text.php', 'group_text_settings_post');
+       Addon::unregisterHook('addon_settings', 'addon/group_text/group_text.php', 'group_text_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/group_text/group_text.php', 'group_text_settings_post');
 
 
        logger("removed group_text");
@@ -43,13 +43,13 @@ function group_text_settings_post($a,$post) {
                return;
        set_pconfig(local_user(),'system','groupedit_image_limit',intval($_POST['group_text']));
 
-       info( t('Group Text settings updated.') . EOL);
+       info(L10n::t('Group Text settings updated.') . EOL);
 }
 
 
 /**
  *
- * Called from the Plugin Setting form. 
+ * Called from the Addon Setting form. 
  * Add our own settings info to the page.
  *
  */
@@ -73,14 +73,14 @@ function group_text_settings(&$a,&$s) {
        /* Add some HTML to the existing form */
 
        $s .= '<div class="settings-block">';
-       $s .= '<h3>' . t('Group Text') . '</h3>';
+       $s .= '<h3>' . L10n::t('Group Text') . '</h3>';
        $s .= '<div id="group_text-enable-wrapper">';
-       $s .= '<label id="group_text-enable-label" for="group_text-checkbox">' . t('Use a text only (non-image) group selector in the "group edit" menu') . '</label>';
+       $s .= '<label id="group_text-enable-label" for="group_text-checkbox">' . L10n::t('Use a text only (non-image) group selector in the "group edit" menu') . '</label>';
        $s .= '<input id="group_text-checkbox" type="checkbox" name="group_text" value="1" ' . $checked . '/>';
        $s .= '</div><div class="clear"></div>';
 
        /* provide a submit button */
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="group_text-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="group_text-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
 }
index 9f42598f1dd1c863566acf260e57c9894bf9c75c..908715593a8b474875e28fd8091f467ef64fad39 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:12+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index e5428e82b45b08935cdb0571e86098e018fec26f..70aff1bfb3c0a9468e94edfd0c14de3cde968363 100644 (file)
@@ -5,18 +5,26 @@
  * Version: 0.1
  * Author: Michael Vogel <https://pirati.ca/profile/heluecht>
  */
-
-require_once("mod/item.php");
-require_once("include/items.php");
-
-function ifttt_install() {
-       register_hook('connector_settings',     'addon/ifttt/ifttt.php', 'ifttt_settings');
-       register_hook('connector_settings_post','addon/ifttt/ifttt.php', 'ifttt_settings_post');
+require_once 'mod/item.php';
+require_once 'include/items.php';
+require_once 'include/text.php';
+
+use Friendica\App;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Database\DBM;
+
+function ifttt_install()
+{
+       Addon::registerHook('connector_settings', 'addon/ifttt/ifttt.php', 'ifttt_settings');
+       Addon::registerHook('connector_settings_post', 'addon/ifttt/ifttt.php', 'ifttt_settings_post');
 }
 
-function ifttt_uninstall() {
-       unregister_hook('connector_settings',   'addon/ifttt/ifttt.php', 'ifttt_settings');
-       unregister_hook('connector_settings_post', 'addon/ifttt/ifttt.php', 'ifttt_settings_post');
+function ifttt_uninstall()
+{
+       Addon::unregisterHook('connector_settings', 'addon/ifttt/ifttt.php', 'ifttt_settings');
+       Addon::unregisterHook('connector_settings_post', 'addon/ifttt/ifttt.php', 'ifttt_settings_post');
 }
 
 function ifttt_module() {
@@ -38,37 +46,36 @@ function ifttt_settings(&$a,&$s) {
        }
 
        $s .= '<span id="settings_ifttt_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_ifttt_expanded\'); openClose(\'settings_ifttt_inflated\');">';
-        $s .= '<img class="connector" src="addon/ifttt/ifttt.png" /><h3 class="connector">'. t('IFTTT Mirror').'</h3>';
-        $s .= '</span>';
-        $s .= '<div id="settings_ifttt_expanded" class="settings-block" style="display: none;">';
-        $s .= '<span class="fakelink" onclick="openClose(\'settings_ifttt_expanded\'); openClose(\'settings_ifttt_inflated\');">';
-        $s .= '<img class="connector" src="addon/ifttt/ifttt.png" /><h3 class="connector">'. t('IFTTT Mirror').'</h3>';
-        $s .= '</span>';
-
-        $s .= '<div id="ifttt-configuration-wrapper">';
-       $s .= '<p>'.t("Create an account at <a href='http://www.ifttt.com'>IFTTT</a>. Create three Facebook recipes that are connected with <a href='https://ifttt.com/maker'>Maker</a> (In the form 'if Facebook then Maker') with the following parameters:").'</p>';
+       $s .= '<img class="connector" src="addon/ifttt/ifttt.png" /><h3 class="connector">' . L10n::t('IFTTT Mirror') . '</h3>';
+       $s .= '</span>';
+       $s .= '<div id="settings_ifttt_expanded" class="settings-block" style="display: none;">';
+       $s .= '<span class="fakelink" onclick="openClose(\'settings_ifttt_expanded\'); openClose(\'settings_ifttt_inflated\');">';
+       $s .= '<img class="connector" src="addon/ifttt/ifttt.png" /><h3 class="connector">' . L10n::t('IFTTT Mirror') . '</h3>';
+       $s .= '</span>';
+
+       $s .= '<div id="ifttt-configuration-wrapper">';
+       $s .= '<p>' . L10n::t('Create an account at <a href="http://www.ifttt.com">IFTTT</a>. Create three Facebook recipes that are connected with <a href="https://ifttt.com/maker">Maker</a> (In the form "if Facebook then Maker") with the following parameters:') . '</p>';
        $s .= '<h4>URL</h4>';
        $s .= '<p>' . $a->get_baseurl() . '/ifttt/' . $a->user['nickname'] . '</p>';
        $s .= '<h4>Method</h4>';
        $s .= '<p>POST</p>';
        $s .= '<h4>Content Type</h4>';
        $s .= '<p>application/x-www-form-urlencoded</p>';
-       $s .= '<h4>'.t("Body for 'new status message'").'</h4>';
-       $s .= '<p><code>'.htmlentities('key='.$key.'&type=status&msg=<<<{{Message}}>>>&date=<<<{{UpdatedAt}}>>>&url=<<<{{PageUrl}}>>>').'</code></p>';
-       $s .= '<h4>'.t("Body for 'new photo upload'").'</h4>';
-       $s .= '<p><code>'.htmlentities('key='.$key.'&type=photo&link=<<<{{Link}}>>>&image=<<<{{ImageSource}}>>>&msg=<<<{{Caption}}>>>&date=<<<{{CreatedAt}}>>>&url=<<<{{PageUrl}}>>>').'</code></p>';
-       $s .= '<h4>'.t("Body for 'new link post'").'</h4>';
-       $s .= '<p><code>'.htmlentities('key='.$key.'&type=link&link=<<<{{Link}}>>>&title=<<<{{Title}}>>>&msg=<<<{{Message}}>>>&description=<<<{{Description}}>>>&date=<<<{{CreatedAt}}>>>&url=<<<{{PageUrl}}>>>').'</code></p>';
-        $s .= '</div><div class="clear"></div>';
-
-        $s .= '<div id="ifttt-rekey-wrapper">';
-        $s .= '<label id="ifttt-rekey-label" for="ifttt-checkbox">' . t('Generate new key') . '</label>';
-        $s .= '<input id="ifttt-checkbox" type="checkbox" name="ifttt-rekey" value="1" />';
-        $s .= '</div><div class="clear"></div>';
-
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="ifttt-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
-        $s .= '</div>';
-
+       $s .= '<h4>' . L10n::t('Body for "new status message"') . '</h4>';
+       $s .= '<p><code>' . htmlentities('key=' . $key . '&type=status&msg=<<<{{Message}}>>>&date=<<<{{UpdatedAt}}>>>&url=<<<{{PageUrl}}>>>') . '</code></p>';
+       $s .= '<h4>' . L10n::t('Body for "new photo upload"') . '</h4>';
+       $s .= '<p><code>' . htmlentities('key=' . $key . '&type=photo&link=<<<{{Link}}>>>&image=<<<{{ImageSource}}>>>&msg=<<<{{Caption}}>>>&date=<<<{{CreatedAt}}>>>&url=<<<{{PageUrl}}>>>') . '</code></p>';
+       $s .= '<h4>' . L10n::t('Body for "new link post"') . '</h4>';
+       $s .= '<p><code>' . htmlentities('key=' . $key . '&type=link&link=<<<{{Link}}>>>&title=<<<{{Title}}>>>&msg=<<<{{Message}}>>>&description=<<<{{Description}}>>>&date=<<<{{CreatedAt}}>>>&url=<<<{{PageUrl}}>>>') . '</code></p>';
+       $s .= '</div><div class="clear"></div>';
+
+       $s .= '<div id="ifttt-rekey-wrapper">';
+       $s .= '<label id="ifttt-rekey-label" for="ifttt-checkbox">' . L10n::t('Generate new key') . '</label>';
+       $s .= '<input id="ifttt-checkbox" type="checkbox" name="ifttt-rekey" value="1" />';
+       $s .= '</div><div class="clear"></div>';
+
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="ifttt-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
+       $s .= '</div>';
 }
 
 function ifttt_settings_post(&$a,&$b) {
index 3e57610a3f9454eb1016ee4410bc20c1d69a0a7b..091edec388c196007bf7cb7777ab6e6c2b7e4232 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Name: Insanejournal Post Connector
  * Description: Post to Insanejournal
@@ -9,20 +8,27 @@
  * Author: Cat Gray <https://free-haven.org/profile/catness>
  */
 
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
+
 function ijpost_install() {
-    register_hook('post_local',           'addon/ijpost/ijpost.php', 'ijpost_post_local');
-    register_hook('notifier_normal',      'addon/ijpost/ijpost.php', 'ijpost_send');
-    register_hook('jot_networks',         'addon/ijpost/ijpost.php', 'ijpost_jot_nets');
-    register_hook('connector_settings',      'addon/ijpost/ijpost.php', 'ijpost_settings');
-    register_hook('connector_settings_post', 'addon/ijpost/ijpost.php', 'ijpost_settings_post');
+    Addon::registerHook('post_local',           'addon/ijpost/ijpost.php', 'ijpost_post_local');
+    Addon::registerHook('notifier_normal',      'addon/ijpost/ijpost.php', 'ijpost_send');
+    Addon::registerHook('jot_networks',         'addon/ijpost/ijpost.php', 'ijpost_jot_nets');
+    Addon::registerHook('connector_settings',      'addon/ijpost/ijpost.php', 'ijpost_settings');
+    Addon::registerHook('connector_settings_post', 'addon/ijpost/ijpost.php', 'ijpost_settings_post');
 
 }
 function ijpost_uninstall() {
-    unregister_hook('post_local',       'addon/ijpost/ijpost.php', 'ijpost_post_local');
-    unregister_hook('notifier_normal',  'addon/ijpost/ijpost.php', 'ijpost_send');
-    unregister_hook('jot_networks',     'addon/ijpost/ijpost.php', 'ijpost_jot_nets');
-    unregister_hook('connector_settings',      'addon/ijpost/ijpost.php', 'ijpost_settings');
-    unregister_hook('connector_settings_post', 'addon/ijpost/ijpost.php', 'ijpost_settings_post');
+    Addon::unregisterHook('post_local',       'addon/ijpost/ijpost.php', 'ijpost_post_local');
+    Addon::unregisterHook('notifier_normal',  'addon/ijpost/ijpost.php', 'ijpost_send');
+    Addon::unregisterHook('jot_networks',     'addon/ijpost/ijpost.php', 'ijpost_jot_nets');
+    Addon::unregisterHook('connector_settings',      'addon/ijpost/ijpost.php', 'ijpost_settings');
+    Addon::unregisterHook('connector_settings_post', 'addon/ijpost/ijpost.php', 'ijpost_settings_post');
 
 }
 
@@ -36,7 +42,7 @@ function ijpost_jot_nets(&$a,&$b) {
         $ij_defpost = get_pconfig(local_user(),'ijpost','post_by_default');
         $selected = ((intval($ij_defpost) == 1) ? ' checked="checked" ' : '');
         $b .= '<div class="profile-jot-net"><input type="checkbox" name="ijpost_enable" ' . $selected . ' value="1" /> '
-            . t('Post to Insanejournal') . '</div>';
+            . L10n::t('Post to Insanejournal') . '</div>';
     }
 }
 
@@ -66,36 +72,36 @@ function ijpost_settings(&$a,&$s) {
 
     /* Add some HTML to the existing form */
     $s .= '<span id="settings_ijpost_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_ijpost_expanded\'); openClose(\'settings_ijpost_inflated\');">';
-    $s .= '<img class="connector" src="images/insanejournal.gif" /><h3 class="connector">'. t("InsaneJournal Export").'</h3>';
+    $s .= '<img class="connector" src="images/insanejournal.gif" /><h3 class="connector">'. L10n::t("InsaneJournal Export").'</h3>';
     $s .= '</span>';
     $s .= '<div id="settings_ijpost_expanded" class="settings-block" style="display: none;">';
     $s .= '<span class="fakelink" onclick="openClose(\'settings_ijpost_expanded\'); openClose(\'settings_ijpost_inflated\');">';
-    $s .= '<img class="connector" src="images/insanejournal.gif" /><h3 class="connector">'. t("InsaneJournal Export").'</h3>';
+    $s .= '<img class="connector" src="images/insanejournal.gif" /><h3 class="connector">'. L10n::t("InsaneJournal Export").'</h3>';
     $s .= '</span>';
 
     $s .= '<div id="ijpost-enable-wrapper">';
-    $s .= '<label id="ijpost-enable-label" for="ijpost-checkbox">' . t('Enable InsaneJournal Post Plugin') . '</label>';
+    $s .= '<label id="ijpost-enable-label" for="ijpost-checkbox">' . L10n::t('Enable InsaneJournal Post Addon') . '</label>';
     $s .= '<input id="ijpost-checkbox" type="checkbox" name="ijpost" value="1" ' . $checked . '/>';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="ijpost-username-wrapper">';
-    $s .= '<label id="ijpost-username-label" for="ijpost-username">' . t('InsaneJournal username') . '</label>';
+    $s .= '<label id="ijpost-username-label" for="ijpost-username">' . L10n::t('InsaneJournal username') . '</label>';
     $s .= '<input id="ijpost-username" type="text" name="ij_username" value="' . $ij_username . '" />';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="ijpost-password-wrapper">';
-    $s .= '<label id="ijpost-password-label" for="ijpost-password">' . t('InsaneJournal password') . '</label>';
+    $s .= '<label id="ijpost-password-label" for="ijpost-password">' . L10n::t('InsaneJournal password') . '</label>';
     $s .= '<input id="ijpost-password" type="password" name="ij_password" value="' . $ij_password . '" />';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="ijpost-bydefault-wrapper">';
-    $s .= '<label id="ijpost-bydefault-label" for="ijpost-bydefault">' . t('Post to InsaneJournal by default') . '</label>';
+    $s .= '<label id="ijpost-bydefault-label" for="ijpost-bydefault">' . L10n::t('Post to InsaneJournal by default') . '</label>';
     $s .= '<input id="ijpost-bydefault" type="checkbox" name="ij_bydefault" value="1" ' . $def_checked . '/>';
     $s .= '</div><div class="clear"></div>';
 
     /* provide a submit button */
 
-    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="ijpost-submit" name="ijpost-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="ijpost-submit" name="ijpost-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
 }
 
@@ -172,16 +178,12 @@ function ijpost_send(&$a,&$b) {
        $ij_blog = 'http://www.insanejournal.com/interface/xmlrpc';
 
        if($ij_username && $ij_password && $ij_blog) {
-
-               require_once('include/bbcode.php');
-               require_once('include/datetime.php');
-
                $title = $b['title'];
-               $post = bbcode($b['body']);
+               $post = BBCode::convert($b['body']);
                $post = xmlify($post);
                $tags = ijpost_get_tags($b['tag']);
 
-               $date = datetime_convert('UTC',$tz,$b['created'],'Y-m-d H:i:s');
+               $date = DateTimeFormat::convert($b['created'], $tz);
                $year = intval(substr($date,0,4));
                $mon  = intval(substr($date,5,2));
                $day  = intval(substr($date,8,2));
@@ -217,8 +219,9 @@ EOT;
 
                logger('ijpost: data: ' . $xml, LOGGER_DATA);
 
-               if($ij_blog !== 'test')
-                       $x = post_url($ij_blog,$xml,array("Content-Type: text/xml"));
+               if($ij_blog !== 'test') {
+                       $x = Network::post($ij_blog, $xml, ["Content-Type: text/xml"]);
+               }
                logger('posted to insanejournal: ' . ($x) ? $x : '', LOGGER_DEBUG);
 
        }
index 4f62c23aeff969d0d080978a8adacb1c790dad25..33e9c31aa4cf6d5d3169a3d89ebb32c2f92b10a0 100644 (file)
@@ -26,7 +26,7 @@ msgid "InsaneJournal Post Settings"
 msgstr ""
 
 #: ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
+msgid "Enable InsaneJournal Post Addon"
 msgstr ""
 
 #: ijpost.php:77
index b5382615171ba2df2b440f1da324afced80a64a7..a1f796d6fc73c283a62cbb7edad379e539bb6c73 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Insanejournal"] = "Enviament a Insanejournal";\r
 $a->strings["InsaneJournal Post Settings"] = "Ajustos d'Enviament a Insanejournal";\r
-$a->strings["Enable InsaneJournal Post Plugin"] = "Habilita el Plugin d'Enviaments a Insanejournal";\r
+$a->strings["Enable InsaneJournal Post Addon"] = "Habilita el Addon d'Enviaments a Insanejournal";\r
 $a->strings["InsaneJournal username"] = "Nom d'usuari de Insanejournal";\r
 $a->strings["InsaneJournal password"] = "Contrasenya de Insanejournal";\r
 $a->strings["Post to InsaneJournal by default"] = "Enviar per defecte a Insanejournal";\r
index 491112fb6ec51b5f3f143e86ad4df990d5b4e0e6..dd273de413a667030361e5763e9cba8bf052155d 100644 (file)
@@ -28,8 +28,8 @@ msgid "InsaneJournal Post Settings"
 msgstr "Nastavení příspěvků pro InsaneJournal"
 
 #: ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
-msgstr "Povolit Insanejournal plugin"
+msgid "Enable InsaneJournal Post Addon"
+msgstr "Povolit Insanejournal addon"
 
 #: ijpost.php:77
 msgid "InsaneJournal username"
index 157e6a8e7137c4d4b2fd04c6e3abfc18072bacfc..4f4fec3665d6bbe5f17fe7ba0ce2a01373a2028c 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_cs($n){
 ;
 $a->strings["Post to Insanejournal"] = "Odeslat na Insanejournal";
 $a->strings["InsaneJournal Post Settings"] = "Nastavení příspěvků pro InsaneJournal";
-$a->strings["Enable InsaneJournal Post Plugin"] = "Povolit Insanejournal plugin";
+$a->strings["Enable InsaneJournal Post Addon"] = "Povolit Insanejournal addon";
 $a->strings["InsaneJournal username"] = "Insanejournal uživatelské jméno";
 $a->strings["InsaneJournal password"] = "Insanejournal heslo";
 $a->strings["Post to InsaneJournal by default"] = "Defaultně zasílat  příspěvky na InsaneJournal";
index 6d3897ebee45f7218efea3ed66d683a4714e3759..35101521d9e99590b9caeb5140368801934ddbfa 100644 (file)
@@ -29,8 +29,8 @@ msgid "InsaneJournal Post Settings"
 msgstr "InsaneJournal Beitrags-Einstellungen"
 
 #: ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
-msgstr "InsaneJournal Plugin aktivieren"
+msgid "Enable InsaneJournal Post Addon"
+msgstr "InsaneJournal Addon aktivieren"
 
 #: ijpost.php:77
 msgid "InsaneJournal username"
index e256daecba1f9145e1adeb78f84c88538c0509f8..3b8dbb6d8a099fee08dcd30fc08b635c96626c1d 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_de($n){
 ;
 $a->strings["Post to Insanejournal"] = "Auf InsaneJournal posten.";
 $a->strings["InsaneJournal Post Settings"] = "InsaneJournal Beitrags-Einstellungen";
-$a->strings["Enable InsaneJournal Post Plugin"] = "InsaneJournal Plugin aktivieren";
+$a->strings["Enable InsaneJournal Post Addon"] = "InsaneJournal Addon aktivieren";
 $a->strings["InsaneJournal username"] = "InsaneJournal Benutzername";
 $a->strings["InsaneJournal password"] = "InsaneJournal Passwort";
 $a->strings["Post to InsaneJournal by default"] = "Standardmäßig auf InsaneJournal posten.";
index 116988871c2b73f50b3b98f9d578954901e89c25..bab5fc08b1ece01b82bbdf8c46907adbb578ed4d 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Insanejournal"] = "Afiŝi al Insanejournal";\r
 $a->strings["InsaneJournal Post Settings"] = "Agordoj pri Insaenejournal Afiŝoj";\r
-$a->strings["Enable InsaneJournal Post Plugin"] = "Ŝalti la InsaneJournal afiŝo kromprogramon.";\r
+$a->strings["Enable InsaneJournal Post Addon"] = "Ŝalti la InsaneJournal afiŝo kromprogramon.";\r
 $a->strings["InsaneJournal username"] = "Salutnomo ĉe InsaneJournal";\r
 $a->strings["InsaneJournal password"] = "Pasvorto ĉe InsaneJournal";\r
 $a->strings["Post to InsaneJournal by default"] = "Defaŭlte afiŝi ĉe InsaneJournal";\r
index c4d5c06bfa44aa43aa975c074e6683ee2292c0c1..7aa4e1a8cf42c3977cc93e6f69deeffe87eaac8d 100644 (file)
@@ -28,8 +28,8 @@ msgid "InsaneJournal Post Settings"
 msgstr "Ajustes de Entrada de InsaneJournal"
 
 #: ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
-msgstr "Habilitar el Plugin de Entrada InsaneJournal"
+msgid "Enable InsaneJournal Post Addon"
+msgstr "Habilitar el Addon de Entrada InsaneJournal"
 
 #: ijpost.php:77
 msgid "InsaneJournal username"
index db51f3722ffa50544caf8d3a01be90005c42acb9..76c9e5f94d1860f6669caa1200fe9d62834cec42 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_es($n){
 ;
 $a->strings["Post to Insanejournal"] = "Publicar en Insanejournal";
 $a->strings["InsaneJournal Post Settings"] = "Ajustes de Entrada de InsaneJournal";
-$a->strings["Enable InsaneJournal Post Plugin"] = "Habilitar el Plugin de Entrada InsaneJournal";
+$a->strings["Enable InsaneJournal Post Addon"] = "Habilitar el Addon de Entrada InsaneJournal";
 $a->strings["InsaneJournal username"] = "Nombre de usuario InsaneJournal";
 $a->strings["InsaneJournal password"] = "Contraseña de InsaneJournal";
 $a->strings["Post to InsaneJournal by default"] = "Publicar en InsaneJournal por defecto";
index 7db58ccf9f82850eeb0e79863a6e2c5e11724fc1..398e3c623564d8a784d1c5ac602274643f3c1f14 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Insanejournal"] = "Publier vers InsaneJournal";\r
 $a->strings["InsaneJournal Post Settings"] = "Réglages InsaneJournal";\r
-$a->strings["Enable InsaneJournal Post Plugin"] = "Activer le connecteur InsaneJournal";\r
+$a->strings["Enable InsaneJournal Post Addon"] = "Activer le connecteur InsaneJournal";\r
 $a->strings["InsaneJournal username"] = "Utilisateur InsaneJournal";\r
 $a->strings["InsaneJournal password"] = "Mot de passe InsaneJournal";\r
 $a->strings["Post to InsaneJournal by default"] = "Publier sur InsaneJournal par défaut";\r
index b79f347ef622e2aca0589e4c85f67400af2a9bf0..3dffb3207e99db47af4dc175d5444fedd4d402cb 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Insanejournal"] = "";\r
 $a->strings["InsaneJournal Post Settings"] = "";\r
-$a->strings["Enable InsaneJournal Post Plugin"] = "";\r
+$a->strings["Enable InsaneJournal Post Addon"] = "";\r
 $a->strings["InsaneJournal username"] = "";\r
 $a->strings["InsaneJournal password"] = "";\r
 $a->strings["Post to InsaneJournal by default"] = "";\r
index aba0684679069d4283e238b31dd7d58f25a29195..a98a2be32590afed5f85866f852aebdd26cbb06d 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:15+0000\n"
+"PO-Revision-Date: 2018-03-19 13:22+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -28,8 +28,8 @@ msgid "InsaneJournal Post Settings"
 msgstr "Impostazioni post InsaneJournal"
 
 #: ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
-msgstr "Abilita il plugin di invio a InsaneJournal"
+msgid "Enable InsaneJournal Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio a InsaneJournal"
 
 #: ijpost.php:77
 msgid "InsaneJournal username"
index 73e8bed467fc235554dbb70a3e0eadc1d541e8d2..d8bd49e985ea0a11daf14fa553b05c37de34c5ff 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_it($n){
 ;
 $a->strings["Post to Insanejournal"] = "Invia a InsaneJournal";
 $a->strings["InsaneJournal Post Settings"] = "Impostazioni post InsaneJournal";
-$a->strings["Enable InsaneJournal Post Plugin"] = "Abilita il plugin di invio a InsaneJournal";
+$a->strings["Enable InsaneJournal Post Addon"] = "Abilita il componente aggiuntivo di invio a InsaneJournal";
 $a->strings["InsaneJournal username"] = "Nome utente InsaneJournal";
 $a->strings["InsaneJournal password"] = "Password InsaneJournal";
 $a->strings["Post to InsaneJournal by default"] = "Invia sempre a InsaneJournal";
index 2eaa62e358fb90287aeb1314ea7dbb1d00a69756..4b616bcd88f869c356b750d6233ec19d8ddef93b 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Insanejournal"] = "";\r
 $a->strings["InsaneJournal Post Settings"] = "";\r
-$a->strings["Enable InsaneJournal Post Plugin"] = "";\r
+$a->strings["Enable InsaneJournal Post Addon"] = "";\r
 $a->strings["InsaneJournal username"] = "";\r
 $a->strings["InsaneJournal password"] = "";\r
 $a->strings["Post to InsaneJournal by default"] = "";\r
index 5b6ec6743eec412fc28c0c2dd6e131dbe39b0a14..e3f180595b63326ca81ee19b011d87af4152e3ee 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Insanejournal"] = "Opublikuj na Insanejournal";\r
 $a->strings["InsaneJournal Post Settings"] = "";\r
-$a->strings["Enable InsaneJournal Post Plugin"] = "";\r
+$a->strings["Enable InsaneJournal Post Addon"] = "";\r
 $a->strings["InsaneJournal username"] = "";\r
 $a->strings["InsaneJournal password"] = "";\r
 $a->strings["Post to InsaneJournal by default"] = "";\r
index 40f4f6dfecbd15fe461c8c2bc31aa426e2228e07..b3f799bd8b8185c55d16e1885f7a8350f5556dc1 100644 (file)
@@ -28,7 +28,7 @@ msgid "InsaneJournal Post Settings"
 msgstr "Configurações de publicação no InsaneJournal"
 
 #: ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
+msgid "Enable InsaneJournal Post Addon"
 msgstr "Habilitar plug-in para publicar no InsaneJournal"
 
 #: ijpost.php:77
index b48f4dececfec564b1484f4fb24a71853939710d..fbc1f2840c6bff8ea0bbdf40890d8655694a0680 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_pt_br($n){
 ;
 $a->strings["Post to Insanejournal"] = "Publicar no Insanejournal";
 $a->strings["InsaneJournal Post Settings"] = "Configurações de publicação no InsaneJournal";
-$a->strings["Enable InsaneJournal Post Plugin"] = "Habilitar plug-in para publicar no InsaneJournal";
+$a->strings["Enable InsaneJournal Post Addon"] = "Habilitar plug-in para publicar no InsaneJournal";
 $a->strings["InsaneJournal username"] = "Nome de usuário no InsaneJournal";
 $a->strings["InsaneJournal password"] = "Senha do InsaneJournal";
 $a->strings["Post to InsaneJournal by default"] = "Publicar no InsaneJournal por padrão";
index 5743743a39f931635c254f4353009d82b1cfef81..c37bed7ea0061d5fc0c0a9a0bc61dcdfd9ff7e92 100644 (file)
@@ -28,7 +28,7 @@ msgid "InsaneJournal Post Settings"
 msgstr "Configurări Postări Insaneournal"
 
 #: ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
+msgid "Enable InsaneJournal Post Addon"
 msgstr "Activare Modul Postare InsaneJournal"
 
 #: ijpost.php:77
index a42334608bb2d9b08dee194f6d643f336c29ee74..35d64ea6c00f4e9cc6e907a6f0dcf3edf0295622 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_ro($n){
 ;
 $a->strings["Post to Insanejournal"] = "Postare pe Insanejournal";
 $a->strings["InsaneJournal Post Settings"] = "Configurări Postări Insaneournal";
-$a->strings["Enable InsaneJournal Post Plugin"] = "Activare Modul Postare InsaneJournal";
+$a->strings["Enable InsaneJournal Post Addon"] = "Activare Modul Postare InsaneJournal";
 $a->strings["InsaneJournal username"] = "Utilizator InsaneJournal ";
 $a->strings["InsaneJournal password"] = "Parolă InsaneJournal ";
 $a->strings["Post to InsaneJournal by default"] = "Postați implicit pe InsaneJournal ";
index 0109f8a60e33f133d663c63ee270fcf86b11bc01..dc869896c0f9ca53e16e2f3b73a51cd66a561641 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Insanejournal"] = "";\r
 $a->strings["InsaneJournal Post Settings"] = "";\r
-$a->strings["Enable InsaneJournal Post Plugin"] = "Включить InsaneJournal  плагин сообщений";\r
+$a->strings["Enable InsaneJournal Post Addon"] = "Включить InsaneJournal  плагин сообщений";\r
 $a->strings["InsaneJournal username"] = "";\r
 $a->strings["InsaneJournal password"] = "";\r
 $a->strings["Post to InsaneJournal by default"] = "";\r
index f2a047123502d1c26b52ca77c47b30bbafa6cc5d..273451d76c64ceeef446fda4b4f2fc77527b3890 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Insanejournal"] = "转播到Insanejournal";\r
 $a->strings["InsaneJournal Post Settings"] = "Insanejournal转播设置";\r
-$a->strings["Enable InsaneJournal Post Plugin"] = "使InsaneJournal转播插件可用";\r
+$a->strings["Enable InsaneJournal Post Addon"] = "使InsaneJournal转播插件可用";\r
 $a->strings["InsaneJournal username"] = "InsaneJournal用户名";\r
 $a->strings["InsaneJournal password"] = "InsaneJournal密码";\r
 $a->strings["Post to InsaneJournal by default"] = "默认地转播到InsaneJournal";\r
index cf420ba10d0df2eacaec39fe6a89d7b9c6f62a10..963a085e2d6b419e6b614465d203dc53422b4f48 100644 (file)
@@ -1,4 +1,4 @@
-Impressum Plugin for Friendica
+Impressum Addon for Friendica
 ==============================
 
 * Author: Tobias Diekershoff
@@ -7,7 +7,7 @@ Impressum Plugin for Friendica
 
 About
 -----
-This plugin adds an Impressum (contact) block to the /friendica page with 
+This addon adds an Impressum (contact) block to the /friendica page with 
 informations about the page operator/owner and how to contact you in case of
 any questions.
 
@@ -16,7 +16,7 @@ normal friendica postings..
 
 Configuration
 -------------
-Simply fill in the fields in the impressium settings page in the plugins 
+Simply fill in the fields in the impressium settings page in the addons 
 area of your admin panel. For email adresses the "@" symbol will be obfuscated
 in the source of the page to make in harder for harvesting tools.
 
index 235c4147785f5b5628e0c59634c040fcae049d9e..e64e1cd2479ee7c35c8a1c6877f58acd02eaef04 100644 (file)
@@ -1,25 +1,29 @@
 <?php
 /**
  * Name: Impressum
- * Description: Plugin to add contact information to the about page (/friendica)
+ * Description: Addon to add contact information to the about page (/friendica)
  * Version: 1.3
  * Author: Tobias Diekershoff <https://f.diekershoff.de/profile/tobias>
  * License: 3-clause BSD license
  */
 
-require_once('include/bbcode.php');
-require_once('mod/proxy.php');
+require_once 'mod/proxy.php';
+
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
 
 function impressum_install() {
-    register_hook('about_hook', 'addon/impressum/impressum.php', 'impressum_show');
-    register_hook('page_end', 'addon/impressum/impressum.php', 'impressum_footer');
-    logger("installed impressum plugin");
+    Addon::registerHook('about_hook', 'addon/impressum/impressum.php', 'impressum_show');
+    Addon::registerHook('page_end', 'addon/impressum/impressum.php', 'impressum_footer');
+    logger("installed impressum Addon");
 }
 
 function impressum_uninstall() {
-    unregister_hook('about_hook', 'addon/impressum/impressum.php', 'impressum_show');
-    unregister_hook('page_end', 'addon/impressum/impressum.php', 'impressum_footer');
-    logger("uninstalled impressum plugin");
+    Addon::unregisterHook('about_hook', 'addon/impressum/impressum.php', 'impressum_show');
+    Addon::unregisterHook('page_end', 'addon/impressum/impressum.php', 'impressum_footer');
+    logger("uninstalled impressum Addon");
 }
 
 function impressum_module() {
@@ -35,7 +39,7 @@ function obfuscate_email ($s) {
     return $s;
 }
 function impressum_footer($a, &$b) {
-    $text = proxy_parse_html(bbcode(get_config('impressum','footer_text'), true));
+    $text = proxy_parse_html(BBCode::convert(Config::get('impressum','footer_text')));
     if (! $text == '') {
         $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'.$a->get_baseurl().'/addon/impressum/impressum.css" media="all" />';
         $b .= '<div class="clear"></div>';
@@ -43,12 +47,12 @@ function impressum_footer($a, &$b) {
     }
 }
 function impressum_show($a,&$b) {
-    $b .= '<h3>'.t('Impressum').'</h3>';
-    $owner = get_config('impressum', 'owner');
-    $owner_profile = get_config('impressum','ownerprofile');
-    $postal = proxy_parse_html(bbcode(get_config('impressum', 'postal'), true));
-    $notes = proxy_parse_html(bbcode(get_config('impressum', 'notes'), true));
-    $email = obfuscate_email( get_config('impressum','email') );
+    $b .= '<h3>'.L10n::t('Impressum').'</h3>';
+    $owner = Config::get('impressum', 'owner');
+    $owner_profile = Config::get('impressum','ownerprofile');
+    $postal = proxy_parse_html(BBCode::convert(Config::get('impressum', 'postal')));
+    $notes = proxy_parse_html(BBCode::convert(Config::get('impressum', 'notes')));
+    $email = obfuscate_email( Config::get('impressum','email') );
     if (strlen($owner)) {
         if (strlen($owner_profile)) {
             $tmp = '<a href="'.$owner_profile.'">'.$owner.'</a>';
@@ -56,45 +60,45 @@ function impressum_show($a,&$b) {
             $tmp = $owner;
         }
         if (strlen($email)) {
-            $b .= '<p><strong>'.t('Site Owner').'</strong>: '. $tmp .'<br /><strong>'.t('Email Address').'</strong>: '.$email.'</p>';
+            $b .= '<p><strong>'.L10n::t('Site Owner').'</strong>: '. $tmp .'<br /><strong>'.L10n::t('Email Address').'</strong>: '.$email.'</p>';
         } else {
-            $b .= '<p><strong>'.t('Site Owner').'</strong>: '. $tmp .'</p>';
+            $b .= '<p><strong>'.L10n::t('Site Owner').'</strong>: '. $tmp .'</p>';
         }
         if (strlen($postal)) {
-            $b .= '<p><strong>'.t('Postal Address').'</strong><br />'. $postal .'</p>';
+            $b .= '<p><strong>'.L10n::t('Postal Address').'</strong><br />'. $postal .'</p>';
         }
         if (strlen($notes)) {
             $b .= '<p>'.$notes.'</p>';
         }
     } else {
-        $b .= '<p>'.t('The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon.').'</p>';
+        $b .= '<p>'.L10n::t('The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon.').'</p>';
     }
 }
 
-function impressum_plugin_admin_post (&$a) {
+function impressum_addon_admin_post (&$a) {
     $owner = ((x($_POST, 'owner')) ? notags(trim($_POST['owner'])) : '');
     $ownerprofile = ((x($_POST, 'ownerprofile')) ? notags(trim($_POST['ownerprofile'])) : '');
     $postal = ((x($_POST, 'postal')) ? (trim($_POST['postal'])) : '');
     $notes = ((x($_POST, 'notes')) ? (trim($_POST['notes'])) : '');
     $email = ((x($_POST, 'email')) ? notags(trim($_POST['email'])) : '');
     $footer_text = ((x($_POST, 'footer_text')) ? (trim($_POST['footer_text'])) : '');
-    set_config('impressum','owner',strip_tags($owner));
-    set_config('impressum','ownerprofile',strip_tags($ownerprofile));
-    set_config('impressum','postal',strip_tags($postal));
-    set_config('impressum','email',strip_tags($email));
-    set_config('impressum','notes',strip_tags($notes));
-    set_config('impressum','footer_text',strip_tags($footer_text));
-    info( t('Settings updated.'). EOL );
+    Config::set('impressum','owner',strip_tags($owner));
+    Config::set('impressum','ownerprofile',strip_tags($ownerprofile));
+    Config::set('impressum','postal',strip_tags($postal));
+    Config::set('impressum','email',strip_tags($email));
+    Config::set('impressum','notes',strip_tags($notes));
+    Config::set('impressum','footer_text',strip_tags($footer_text));
+    info(L10n::t('Settings updated.'). EOL );
 }
-function impressum_plugin_admin (&$a, &$o) {
+function impressum_addon_admin (&$a, &$o) {
     $t = get_markup_template( "admin.tpl", "addon/impressum/" );
-    $o = replace_macros($t, array(
-        '$submit' => t('Save Settings'),
-        '$owner' => array('owner', t('Site Owner'), get_config('impressum','owner'), t('The page operators name.')),
-        '$ownerprofile' => array('ownerprofile', t('Site Owners Profile'), get_config('impressum','ownerprofile'), t('Profile address of the operator.')),
-        '$postal' => array('postal', t('Postal Address'), get_config('impressum','postal'), t('How to contact the operator via snail mail. You can use BBCode here.')),
-        '$notes' => array('notes', t('Notes'), get_config('impressum','notes'), t('Additional notes that are displayed beneath the contact information. You can use BBCode here.')),
-        '$email' => array('email', t('Email Address'), get_config('impressum','email'), t('How to contact the operator via email. (will be displayed obfuscated)')),
-        '$footer_text' => array('footer_text', t('Footer note'), get_config('impressum','footer_text'), t('Text for the footer. You can use BBCode here.')),
-    ));
+    $o = replace_macros($t, [
+        '$submit' => L10n::t('Save Settings'),
+        '$owner' => ['owner', L10n::t('Site Owner'), Config::get('impressum','owner'), L10n::t('The page operators name.')],
+        '$ownerprofile' => ['ownerprofile', L10n::t('Site Owners Profile'), Config::get('impressum','ownerprofile'), L10n::t('Profile address of the operator.')],
+        '$postal' => ['postal', L10n::t('Postal Address'), Config::get('impressum','postal'), L10n::t('How to contact the operator via snail mail. You can use BBCode here.')],
+        '$notes' => ['notes', L10n::t('Notes'), Config::get('impressum','notes'), L10n::t('Additional notes that are displayed beneath the contact information. You can use BBCode here.')],
+        '$email' => ['email', L10n::t('Email Address'), Config::get('impressum','email'), L10n::t('How to contact the operator via email. (will be displayed obfuscated)')],
+        '$footer_text' => ['footer_text', L10n::t('Footer note'), Config::get('impressum','footer_text'), L10n::t('Text for the footer. You can use BBCode here.')],
+    ]);
 }
index 1a73058ae38710baf46874e06624a18245b0233f..11d4a512886b3535bfbaee4ab672cdfbae7b6478 100644 (file)
@@ -41,7 +41,7 @@ msgid ""
 "The impressum addon needs to be configured!<br />Please add at least the "
 "<tt>owner</tt> variable to your config file. For other variables please "
 "refer to the README file of the addon."
-msgstr "Das Impressums-Plugin muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README-Datei des Addons erläutert."
+msgstr "Das Impressums-Addon muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README-Datei des Addons erläutert."
 
 #: impressum.php:78
 msgid "Settings updated."
index 66acf0973c85bc02153b9d3b75bf5ebb2617a714..0cf1a4aeaafec6cf3836952858b023df3c43677a 100644 (file)
@@ -9,7 +9,7 @@ $a->strings["Impressum"] = "Impressum";
 $a->strings["Site Owner"] = "Betreiber der Seite";
 $a->strings["Email Address"] = "Email Adresse";
 $a->strings["Postal Address"] = "Postalische Anschrift";
-$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "Das Impressums-Plugin muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README-Datei des Addons erläutert.";
+$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "Das Impressums-Addon muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README-Datei des Addons erläutert.";
 $a->strings["Settings updated."] = "Einstellungen aktualisiert.";
 $a->strings["Submit"] = "Senden";
 $a->strings["The page operators name."] = "Name des Server-Administrators";
index ae430ef41919b09023fef13b9897211ef8ff524c..60f25ac583f7509ebc22c3a65873bb52f0fdc232 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:15+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index 5e46b3b7b6837b5df906896dbc208738ba932097..e92d34407ea861b192ffb79c407eaf1edfc15f7c 100644 (file)
@@ -5,45 +5,47 @@
 * Version: 1.0
 * Author: Thomas Willingham <https://kakste.com/profile/beardyunixer>
 */
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
 
-function infiniteimprobabilitydrive_install() {
-register_hook('app_menu', 'addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.php', 'infiniteimprobabilitydrive_app_menu');
+function infiniteimprobabilitydrive_install()
+{
+       Addon::registerHook('app_menu', 'addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.php', 'infiniteimprobabilitydrive_app_menu');
 }
 
-function infiniteimprobabilitydrive_uninstall() {
-unregister_hook('app_menu', 'addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.php', 'infiniteimprobabilitydrive_app_menu');
-
+function infiniteimprobabilitydrive_uninstall()
+{
+       Addon::unregisterHook('app_menu', 'addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.php', 'infiniteimprobabilitydrive_app_menu');
 }
 
-function infiniteimprobabilitydrive_app_menu($a,&$b) {
-$b['app_menu'][] = '<div class="app-title"><a href="infiniteimprobabilitydrive">' . t('Infinite Improbability Drive') . '</a></div>';
+function infiniteimprobabilitydrive_app_menu($a, &$b)
+{
+       $b['app_menu'][] = '<div class="app-title"><a href="infiniteimprobabilitydrive">' . L10n::t('Infinite Improbability Drive') . '</a></div>';
 }
 
 
-function infiniteimprobabilitydrive_module() {
-return;
+function infiniteimprobabilitydrive_module()
+{
+       return;
 }
 
 
-function infiniteimprobabilitydrive_content(&$a) {
-$baseurl = $a->get_baseurl() . '/addon/infiniteimprobabilitydrive';
-$o = '';
-
-$a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'.$a->get_baseurl().'/addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.css"/>';
+function infiniteimprobabilitydrive_content(&$a)
+{
+       $baseurl = $a->get_baseurl() . '/addon/infiniteimprobabilitydrive';
+       $o = '';
 
+       $a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'.$a->get_baseurl().'/addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.css"/>';
 
-$baseurl = $a->get_baseurl();
 
+       $baseurl = $a->get_baseurl();
 
-  $o .= <<< EOT
+       $o .= <<< EOT
 
 <br><br>
 <p>Try another destination with the <a href="$baseurl/infiniteimprobabilitydrive">Infinite Improbability Drive</a>
 <iframe src ="$baseurl/randprof" height="1200" width="1024">
 
-
-
 EOT;
-return $o;
-    
-}
\ No newline at end of file
+       return $o;
+}
index 2b68b0123fde1541d585a4a9d7088c962271e6dd..be86c98b24b1554db027f5544453125ae3ceed26 100644 (file)
@@ -9,8 +9,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-22 13:18+0200\n"
-"PO-Revision-Date: 2014-09-10 12:23+0000\n"
+"POT-Creation-Date: 2013-02-27 05:01-0500\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index 0ac7be37e8ed3c27fa7ec56d887381a82aa8c73d..e8dd92f46f586dfb704e4755ce58479365403967 100644 (file)
@@ -1,21 +1,25 @@
 <?php
 /**
-* Name: IRC Chat Plugin
+* Name: IRC Chat Addon
 * Description: add an Internet Relay Chat chatroom on freenode
 * Version: 1.1
 * Author: tony baldwin <https://free-haven.org/profile/tony>
 * Author: Tobias Diekershoff <https://f.diekershoff.de/u/tobias>
 */
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 function irc_install() {
-       register_hook('app_menu', 'addon/irc/irc.php', 'irc_app_menu');
-       register_hook('plugin_settings', 'addon/irc/irc.php', 'irc_addon_settings');
-       register_hook('plugin_settings_post', 'addon/irc/irc.php', 'irc_addon_settings_post');
+       Addon::registerHook('app_menu', 'addon/irc/irc.php', 'irc_app_menu');
+       Addon::registerHook('addon_settings', 'addon/irc/irc.php', 'irc_addon_settings');
+       Addon::registerHook('addon_settings_post', 'addon/irc/irc.php', 'irc_addon_settings_post');
 }
 
 function irc_uninstall() {
-       unregister_hook('app_menu', 'addon/irc/irc.php', 'irc_app_menu');
-       unregister_hook('plugin_settings', 'addon/irc/irc.php', 'irc_addon_settings');
+       Addon::unregisterHook('app_menu', 'addon/irc/irc.php', 'irc_app_menu');
+       Addon::unregisterHook('addon_settings', 'addon/irc/irc.php', 'irc_addon_settings');
 
 }
 
@@ -33,13 +37,13 @@ function irc_addon_settings(&$a,&$s) {
        $autochans = get_pconfig( local_user(), 'irc','autochans');  /* auto connect chans */
 
        $t = get_markup_template( "settings.tpl", "addon/irc/" );
-       $s .= replace_macros($t, array(
-               '$header' => t('IRC Settings'),
-               '$info' => t('Here you can change the system wide settings for the channels to automatically join and access via the side bar. Note the changes you do here, only effect the channel selection if you are logged in.'),
-               '$submit' => t('Save Settings'),
-               '$autochans' => array( 'autochans', t('Channel(s) to auto connect (comma separated)'), $autochans, t('List of channels that shall automatically connected to when the app is launched.')),
-               '$sitechats' => array( 'sitechats', t('Popular Channels (comma separated)'), $sitechats, t('List of popular channels, will be displayed at the side and hotlinked for easy joining.') )
-       ));
+       $s .= replace_macros($t, [
+               '$header' => L10n::t('IRC Settings'),
+               '$info' => L10n::t('Here you can change the system wide settings for the channels to automatically join and access via the side bar. Note the changes you do here, only effect the channel selection if you are logged in.'),
+               '$submit' => L10n::t('Save Settings'),
+               '$autochans' => [ 'autochans', L10n::t('Channel(s) to auto connect (comma separated)'), $autochans, L10n::t('List of channels that shall automatically connected to when the app is launched.')],
+               '$sitechats' => [ 'sitechats', L10n::t('Popular Channels (comma separated)'), $sitechats, L10n::t('List of popular channels, will be displayed at the side and hotlinked for easy joining.') ]
+       ]);
 
 
        return;
@@ -54,12 +58,12 @@ function irc_addon_settings_post(&$a,&$b) {
                set_pconfig( local_user(), 'irc','autochans',trim($_POST['autochans']));
                set_pconfig( local_user(), 'irc','sitechats',trim($_POST['sitechats']));
                /* upid pop-up thing */
-               info( t('IRC settings saved.') . EOL);
+               info(L10n::t('IRC settings saved.') . EOL);
        }
 }
 
 function irc_app_menu($a,&$b) {
-       $b['app_menu'][] = '<div class="app-title"><a href="irc">' . t('IRC Chatroom') . '</a></div>';
+       $b['app_menu'][] = '<div class="app-title"><a href="irc">' . L10n::t('IRC Chatroom') . '</a></div>';
 }
 
 
@@ -87,7 +91,7 @@ function irc_content(&$a) {
                $chats = array('friendica','chat','chatback','hottub','ircbar','dateroom','debian');
 
 
-       $a->page['aside'] .= '<div class="widget"><h3>' . t('Popular Channels') . '</h3><ul>';
+       $a->page['aside'] .= '<div class="widget"><h3>' . L10n::t('Popular Channels') . '</h3><ul>';
        foreach($chats as $chat) {
                $a->page['aside'] .= '<li><a href="' . $a->get_baseurl() . '/irc?channels=' . $chat . '" >' . '#' . $chat . '</a></li>';
        }
@@ -117,7 +121,7 @@ return $o;
     
 }
 
-function irc_plugin_admin_post (&$a) {
+function irc_addon_admin_post (&$a) {
        if(! is_site_admin())
                return;
 
@@ -125,16 +129,16 @@ function irc_plugin_admin_post (&$a) {
                set_config('irc','autochans',trim($_POST['autochans']));
                set_config('irc','sitechats',trim($_POST['sitechats']));
                /* stupid pop-up thing */
-               info( t('IRC settings saved.') . EOL);
+               info(L10n::t('IRC settings saved.') . EOL);
        }
 }
-function irc_plugin_admin (&$a, &$o) {
-       $sitechats = get_config('irc','sitechats'); /* popular channels */
-       $autochans = get_config('irc','autochans');  /* auto connect chans */
+function irc_addon_admin (&$a, &$o) {
+       $sitechats = Config::get('irc','sitechats'); /* popular channels */
+       $autochans = Config::get('irc','autochans');  /* auto connect chans */
        $t = get_markup_template( "admin.tpl", "addon/irc/" );
-       $o = replace_macros($t, array(
-               '$submit' => t('Save Settings'),
-               '$autochans' => array( 'autochans', t('Channel(s) to auto connect (comma separated)'), $autochans, t('List of channels that shall automatically connected to when the app is launched.')),
-               '$sitechats' => array( 'sitechats', t('Popular Channels (comma separated)'), $sitechats, t('List of popular channels, will be displayed at the side and hotlinked for easy joining.') )
-       ));
+       $o = replace_macros($t, [
+               '$submit' => L10n::t('Save Settings'),
+               '$autochans' => [ 'autochans', L10n::t('Channel(s) to auto connect (comma separated)'), $autochans, L10n::t('List of channels that shall automatically connected to when the app is launched.')],
+               '$sitechats' => [ 'sitechats', L10n::t('Popular Channels (comma separated)'), $sitechats, L10n::t('List of popular channels, will be displayed at the side and hotlinked for easy joining.') ]
+       ]);
 }
index 1967c3f89eec817790d77d049f8b5fda282f3fce..69d28e894c54a1090de4909113f891f064e07240 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2015-07-08 13:17+0200\n"
-"PO-Revision-Date: 2015-08-31 10:17+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index f21649be7566669e65feef0283cb32aefd5c2414..0343d060b27deaf59667a486a98ee13df876ae1d 100644 (file)
@@ -1,10 +1,10 @@
-Jappix Mini Plugin
+Jappix Mini Addon
 ==================
 
 This quick-and-dirty addon allows you to add a Jabber-based, Facebook-like chat
 to Friendica. It uses Jappix Mini.
 
-It is necessary to use a BOSH host - so to use this plugin, each users need to
+It is necessary to use a BOSH host - so to use this addon, each users need to
 know the address of a BOSH host that works with his account. The BOSH server of
 the Jappix project (https://bind.jappix.com/) is not locked to a specific XMPP
 provider, but keep in mind that only personal usage is approved according to
index d4e3bf4c25475c53b3a18b4217ae2e43d69cc082..499d709f315a3b43c0ff138144930d3dbfebe5fa 100644 (file)
@@ -78,7 +78,7 @@ function serverAdHoc(server) {
        dataForm(server, 'command', '', '', 'adhoc');
 }
 
-// Plugin launcher
+// Addon launcher
 function launchAdHoc() {
        // Click event
        $('#adhoc .bottom .finish').click(closeAdHoc);
index 88eaa7dc3e1e46f8952238d86f6b513acebadf7f..af4ecb596307c50ad8deecddb55fb148d1b385a6 100644 (file)
@@ -110,7 +110,7 @@ function anonymousLogin(server) {
        }
 }
 
-// Plugin launcher
+// Addon launcher
 function launchAnonymous() {
        logThis('Anonymous mode detected, connecting...', 3);
        
@@ -127,5 +127,5 @@ function launchAnonymous() {
        anonymousLogin(HOST_ANONYMOUS);
 }
 
-// Launch this plugin!
+// Launch this addon!
 $(document).ready(launchAnonymous);
index 387a379fa3f2b528eae470a1db4bcfecd31ec9ae..e6a08029de0968057cfee57ecc7089040ab76408 100644 (file)
@@ -393,7 +393,7 @@ function updateArchives() {
        getListArchives(xid, date);
 }
 
-// Plugin launcher
+// Addon launcher
 function launchArchives() {
        // Current date
        var current_date = explodeThis('T', getXMPPTime(), 0);
index 85a718c5fa24b2d0eb13b387800ad8d60761ca39..afd1f6e8bedf99d828c4333e44796d39c975ab33 100644 (file)
@@ -489,7 +489,7 @@ function getEverything() {
        getStorage(NS_ROSTERNOTES);
 }
 
-// Plugin launcher
+// Addon launcher
 function launchConnection() {
        // Logouts when Jappix is closed
        $(window).bind('beforeunload', terminate);
@@ -522,5 +522,5 @@ function launchConnection() {
        }
 }
 
-// Launch this plugin!
+// Launch this addon!
 $(document).ready(launchConnection);
index ebe1a570791e1dc5db52fa1f2634c36533864daf..d1f69492ea4a2a477b282337d710b6aad0b5a191 100644 (file)
@@ -66,7 +66,7 @@ function startDirectory() {
        return false;
 }
 
-// Plugin launcher
+// Addon launcher
 function launchDirectory() {
        // Click event
        $('#directory .bottom .finish').click(closeDirectory);
index 867037b2c726f229e0bea650f25a2cad772976e1..f4bc0d426296abfe21feb6a5bb3cf4eb5d0bc0ac 100644 (file)
@@ -148,7 +148,7 @@ function cleanDiscovery() {
        $('#discovery .wait, #discovery .disco-category').hide();
 }
 
-// Plugin launcher
+// Addon launcher
 function launchDiscovery() {
        // Click event
        $('#discovery .bottom .finish').click(closeDiscovery);
index 69a042e84ee8a0bf8b0f9c3bb53198fed3ea7905..0b4f1cb0e66a4c627e7b38739fb76e0b24124aa5 100644 (file)
@@ -473,7 +473,7 @@ function loadFavorites() {
        $('#favorites .fedit-head-select').html(favorites_popup);
 }
 
-// Plugin launcher
+// Addon launcher
 function launchFavorites() {
        var path = '#favorites .';
        
index 5322501d3fcaf3c9f2f1ff8b938f2a46047a2d29..fdaba56b9bee8d38d9bd8268265f34ed7244e4a1 100644 (file)
@@ -288,7 +288,7 @@ function registerForm() {
        return false;
 }
 
-// Plugin launcher
+// Addon launcher
 function launchHome() {
        // Define the vars
        var home = '#home ';
@@ -367,5 +367,5 @@ function launchHome() {
        logThis('Welcome to Jappix! Happy coding in developer mode!');
 }
 
-// Launch this plugin!
+// Launch this addon!
 $(document).ready(launchHome);
index 9f54cb93a0cb244f025c4af53b2336b91bc10c88..2fe32730c9759041516e9273d35a2ef7fa6f7f72 100644 (file)
@@ -613,7 +613,7 @@ function handleInboxAttach(responseXML) {
        $('#inbox .wait').hide();
 }
 
-// Plugin launcher
+// Addon launcher
 function launchInbox() {
        // Define the pats
        var inbox = '#inbox .';
index 214b3d72547b87cd97c4c4577bedf912f65a51b3..6d33df1319178f29e448f8965c27638d458c41ff 100644 (file)
@@ -316,13 +316,13 @@ function filterIntegrateBox(data) {
        return string;
 }
 
-// Plugin launcher
+// Addon launcher
 function launchIntegratebox() {
        // Click event
        $('#integratebox .bottom .finish.close').click(closeIntegrateBox);
 }
 
-// Plugin keyup event
+// Addon keyup event
 $(document).keyup(function(e) {
        // Previous item?
        if((exists('#integratebox .bottom .finish.previous:not(.disabled)')) && (e.keyCode == 37)) {
index e4a0db52ef73820c6c6c6cfcf1447da94bd49485..5fe6593bc8b0c4ec5814e05b851543f0b2bbfe97 100644 (file)
@@ -376,11 +376,11 @@ function inputFocus() {
                });
 }
 
-// Plugin launcher
+// Addon launcher
 function launchInterface() {
        // Focus on the first visible input
        $(window).focus(inputFocus);
 }
 
-// Launch this plugin!
+// Launch this addon!
 $(document).ready(launchInterface);
index a4f114586ce4468aae29f8f241f145556377307f..7b0be75f83ce4eb1f902844f92c790db94e76a10 100644 (file)
@@ -1403,7 +1403,7 @@ jQuery.fn.extend({
                });
        },
 
-       // Based off of the plugin by Clint Helfers, with permission.
+       // Based off of the addon by Clint Helfers, with permission.
        // http://blindsignals.com/index.php/2009/07/jquery-delay/
        delay: function( time, type ) {
                time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
index 834bda64bb5d29f1f3cd9dfc16692bfb2ba1d2f7..d9162f0fae8dc5061546ae18ce54ca06f9f9df61 100644 (file)
@@ -64,7 +64,7 @@
        });
 
 
-    // plugin code
+    // addon code
        $.fn.placeholder = function(opts) {
                opts = $.extend({},$.placeholder.settings, opts);
 
index 5720df3417d04bd192cabf8ef9d7abc660127035..bc3038057df7a14f79a9e9bfd8cd7134a56bb191 100644 (file)
@@ -51,7 +51,7 @@ function closeMe() {
        return false;
 }
 
-// Plugin launcher
+// Addon launcher
 function launchMe() {
        // Click events
        $('#me .content a.go').click(function() {
index ceff07ab003d4f2bc8beacbf55873ea0cce80b01..5d489081a20cd5a2d6e9a9abaf9a88efef6b7978 100644 (file)
@@ -1430,7 +1430,7 @@ function fromInfosMicroblog(xid, hash) {
        getMicroblog(xid, hash);
 }
 
-// Plugin launcher
+// Addon launcher
 function launchMicroblog() {
        // Keyboard event
        $('#channel .top input[name=microblog_body]').keyup(function(e) {
index 0bfb80870c9b3dcfc6946d01e4ddf74bb5c55e76..112fbb4c744a50b0ca3d1e6e930746433d0dc16f 100644 (file)
@@ -1543,7 +1543,7 @@ function adaptRosterMini() {
        jQuery('#jappix_mini div.jm_roster div.jm_buddies').css('max-height', height);
 }
 
-// Plugin launcher
+// Addon launcher
 function launchMini(autoconnect, show_pane, domain, user, password) {
        // Save infos to reconnect
        MINI_DOMAIN = domain;
index 3bee965b11796e2c35e21ae7b5115350c3dd6d1d..ca2e89d1f99dd546697c69f2499bbf068d207a32 100644 (file)
@@ -361,7 +361,7 @@ function saveMucAdmin() {
        return closeMucAdmin();
 }
 
-// Plugin launcher
+// Addon launcher
 function launchMucAdmin() {
        // Click events
        $('#mucadmin .bottom .finish').click(function() {
index f367a2b6e5262ea22117f0152075426d9954f02a..af86a060c51e14ff65896175162c0897ffe7ca3b 100644 (file)
@@ -244,7 +244,7 @@ function addMusic(id, title, artist, source, duration, uri, mime, type) {
        return false;
 }
 
-// Plugin launcher
+// Addon launcher
 function launchMusic() {
        // When music search string submitted
        $('.music-content input').keyup(function(e) {
index c0f6c12cde3285f3b1f1995bfb5d5057348cae1f..603d37ad63aa54c7965a1dd3564c10ab96dd0419 100644 (file)
@@ -412,7 +412,7 @@ function adaptNotifications() {
        $('.notifications-content .tools-content-subitem').css('max-height', max_height);
 }
 
-// Plugin launcher
+// Addon launcher
 function launchNotifications() {
        // Adapt the notifications height
        adaptNotifications();
index 0463af4d3781e3dc1fb929e1d10a3ef9a22c1805..8f1ea19016985aed2356615e33db3a14711b421b 100644 (file)
@@ -534,7 +534,7 @@ function loadOptions() {
                $('#integratemedias').attr('checked', true);
 }
 
-// Plugin launcher
+// Addon launcher
 function launchOptions() {
        // Click events
        $('#options .tab a').click(function() {
index 04f9f1567ae5058705e8fa03c56f2337773960a1..2a3ee1ac75bcc8d11d28e49a835eb3c3506cae35 100644 (file)
@@ -652,7 +652,7 @@ function displayAllPEP(xid) {
        displayPEP(xid, 'geoloc');
 }
 
-// Plugin launcher
+// Addon launcher
 function launchPEP() {
        // Apply empty values to the PEP database
        setDB('mood-value', 1, '');
index 0834209c40911f9ee5fe44c0ae1ca28264b53a3a..ef5c1c67b76401c9089cd39e3eb30e477afef3c7 100644 (file)
@@ -973,7 +973,7 @@ function getUserStatus() {
        return $('#presence-status').val();
 }
 
-// Plugin launcher
+// Addon launcher
 function launchPresence() {
        // Click event for user presence show
        $('#my-infos .f-presence a.picker').click(function() {
index 01675f7f26080d840a0e8877fd8d39a69293bc74..d9cd46b61e5b1a12b8fab05bf16fbe6483e968ea 100644 (file)
@@ -645,7 +645,7 @@ function enableFormPrivacy(rank) {
        $('#privacy .privacy-' + rank + ' input, #privacy .privacy-' + rank + ' select').removeAttr('disabled');
 }
 
-// Plugin launcher
+// Addon launcher
 function launchPrivacy() {
        // Click events
        $('#privacy .bottom .finish').click(closePrivacy);
index 99389a7755721959c9febbd401469c90aff80b58..4dca501c73d222d0d104601561bb052c40ba4aa9 100644 (file)
@@ -708,7 +708,7 @@ function getGateways() {
 // Define a global var for buddy list all buddies displayed
 var BLIST_ALL = false;
 
-// Plugin launcher
+// Addon launcher
 function launchRoster() {
        // Filtering tool
        var iFilter = $('#buddy-list .filter input');
index 30f0854cafdb3b497f2530b686485b3795d278db..5cfe118002a11d0767af1610e09914ef65289494 100644 (file)
@@ -166,7 +166,7 @@ function saveRosterX() {
        closeRosterX();
 }
 
-// Plugin launcher
+// Addon launcher
 function launchRosterX() {
        // Click events
        $('#rosterx .bottom .finish').click(function() {
index 7e1320e9fdd00b6f3cb8301334d2d2926f0594de..529de6c7b2bb1a0d05ade4f7ba08022cc362ce2d 100644 (file)
@@ -13,7 +13,7 @@ Last revision: 06/05/11
 
 // Creates the talkpage events
 function eventsTalkPage() {
-       // Launch all associated plugins
+       // Launch all associated addons
        launchMicroblog();
        launchRoster();
        launchPresence();
index 35a58fe563942b472afafed82be17b3ed277bbad..885f3163b03e45a9b428c0e1ba04b3c8c5fa98c6 100644 (file)
@@ -406,7 +406,7 @@ function getUserInfos(hash, xid, nick, type) {
        presenceFunnel(xid, hash);
 }
 
-// Plugin launcher
+// Addon launcher
 function launchUserInfos() {
        // Click events
        $('#userinfos .tab a').click(function() {
index 6e0fa09a368a1f2ebdb3a1a32ee170863a89de1f..f61ca990c5e009b8db3ad619bb17137b3aeabd0f 100644 (file)
@@ -566,7 +566,7 @@ function sendVCard() {
        return false;
 }
 
-// Plugin launcher
+// Addon launcher
 function launchVCard() {
        // Focus on the first input
        $(document).oneTime(10, function() {
index 4faf5bd1d894d0e655ee6fcbdb2bbc8a8f3fb07f..ff19330264ce86a888b62b753c3bfb170818d53e 100644 (file)
@@ -269,7 +269,7 @@ function nextWelcome() {
        return false;
 }
 
-// Plugin launcher
+// Addon launcher
 function launchWelcome() {
        // Click events
        $('#welcome .tab a').click(function() {
index c8cc999bce47c1a06fc845ec7dced8c9e3c2df97..697e7f2f1dd66f636c405b3c054575cbf71b3088 100644 (file)
@@ -1038,7 +1038,7 @@ msgstr ""
 msgid "The folder is writable, you can continue!"
 msgstr ""
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
 msgstr ""
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
index 5d7e06d314fd60eb97564b844566649e172ae12f..6f4a7339173f382be1a84e0e3052667c0fbf0a7f 100644 (file)
@@ -1038,7 +1038,7 @@ msgstr "Jappix трябва да може да вписва данни в таз
 msgid "The folder is writable, you can continue!"
 msgstr "В тази папка/директория може да се записва, можете да продължите!"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
 msgstr "Jappix ви позволява да управлявате и менажирате вашата конфигурация, да инсталирате нови разширения (плъгини) или да потърсите за обновления на програмата (ъпдейти). Затова трябва да създадете администраторска потребителска сметка (акаунт), за да можете да имате достъп до мениджъра с настройките на Jappix."
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
index a1a627224e5ab0d6c14a53f2e4e84272c52812b8..9063b52dec28c73ded0a0e01849af43b63f359cc 100644 (file)
@@ -1038,8 +1038,8 @@ msgstr "Jappix musí mít oprávnění zapisovat do tohoto adresáře pro vytvo
 msgid "The folder is writable, you can continue!"
 msgstr "Do adresáře je povolen zápis, můžete pokračovat!"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix vám úmožňuje spravovat vaší konfiguraci, instalovat pluginy nebo vyhledávat aktualizace. Proto je nutné si vytvořit účet administrátora ke vstupu do Správy Jappix."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix vám úmožňuje spravovat vaší konfiguraci, instalovat addony nebo vyhledávat aktualizace. Proto je nutné si vytvořit účet administrátora ke vstupu do Správy Jappix."
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
 msgstr "Když je Jappix nainstalován, stačí kliknout na odkaz Správce na výchozí stránce pro vstup do Správy. "
index 75dba8f4d5d8f7837c943256bac468dc3f626532..352e9674c8fc6cd83b4b29af48cafefc8887f912 100644 (file)
@@ -1038,8 +1038,8 @@ msgstr "Jappix muss Schreibberechtigungen in diesem Ordner haben um sein Unteror
 msgid "The folder is writable, you can continue!"
 msgstr "Der Ordner ist schreibbar, du kannst weitermachen!"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix bietet dir die Möglichkeit, deine Konfiguration einzustellen, neue Plugins zu installieren oder nach Updates zu suchen. Deshalb musst Du ein Admin-Account anlegen um auf die Verwaltung zugreifen zu können."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix bietet dir die Möglichkeit, deine Konfiguration einzustellen, neue Addons zu installieren oder nach Updates zu suchen. Deshalb musst Du ein Admin-Account anlegen um auf die Verwaltung zugreifen zu können."
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
 msgstr "Wenn Jappix installiert ist, klicke einfach auf den Manager-Link auf der Homepage um darauf zuzugreifen."
index 42b5b2c0e95cf31232fa4c7c949b6f89863ba113..108bb18a714aad2f736d8984a53b6be065a268e4 100644 (file)
@@ -1132,7 +1132,7 @@ msgstr ""
 msgid "The folder is writable, you can continue!"
 msgstr ""
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
 msgstr ""
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
index 346aa5e41191a12189d114c4802c9fb25d93e91e..8926bdaed26826c599686ee31ed826a8ffd7db81 100644 (file)
@@ -1038,7 +1038,7 @@ msgstr "Jappix devas esti kapabla skribi en ĉi tiu teko krei ĝia sub-adresaroj
 msgid "The folder is writable, you can continue!"
 msgstr "La dosierujo estas skribebla, vi povas daŭri!"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
 msgstr "Jappix ebligas vin administri vian konfiguron, instali novajn kromaĵojn aŭ serĉi ĝisdatigojn. Tio estas kial vi devas krei administrantan konton por aliri la manaĝeron."
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
index b9a5714112843e1f479e595048042d8a1a8c29f4..9716a39e28e73c0add4d48ddac5a1e6f24681489 100644 (file)
@@ -1038,8 +1038,8 @@ msgstr "Jappix debe ser capaz de escribir en esta carpeta para crear sus sub-dir
 msgid "The folder is writable, you can continue!"
 msgstr "La carpeta es escribible, ¡puedes continuar!"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix te ofrece la posibilidad de gestionar tu configuración, instalar nuevos plugins y buscar actualizaciones. Por eso tienes que crear una cuenta de administración para acceder al gerente."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix te ofrece la posibilidad de gestionar tu configuración, instalar nuevos addons y buscar actualizaciones. Por eso tienes que crear una cuenta de administración para acceder al gerente."
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
 msgstr "Cuando Jappix esté instalado, basta con hacer clic en el enlace de gerente en la página principal para acceder."
index f91ace4cc112112711d285ef9f5c63052ae3a97e..b48715a92f5789fd0310b1ea2e7e054aec19d688 100644 (file)
@@ -1038,8 +1038,8 @@ msgstr "Jappixil peab olema siia ja alamkataloogidesse kirjutusõigus. Kui see p
 msgid "The folder is writable, you can continue!"
 msgstr "Kataloogil on kirjutusõigused, Te võite jätkata!"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix pakub võimalust hallata oma konfiguratsiooni, installida uusi pluginaid või otsida uuendusi. Sellepärast peate te tegema administraatori konto, et haldus lehele ligi pääseda."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix pakub võimalust hallata oma konfiguratsiooni, installida uusi addonaid või otsida uuendusi. Sellepärast peate te tegema administraatori konto, et haldus lehele ligi pääseda."
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
 msgstr "Kui Jappix on paigaldatud siis lihtsalt vajutage Haldaja lingile avalehel, et sellele ligi pääseda."
index b6771020a626ba4cff1231e214ab5f63aa9c2dac..ed3782ca9f55999fbd7a8c25ad05d2eed3c28ee7 100644 (file)
@@ -1038,7 +1038,7 @@ msgstr ""
 msgid "The folder is writable, you can continue!"
 msgstr "پوشه قابل ویرایش است. می‌توانید ادامه دهید!"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
 msgstr ""
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
index 38cf556bc4afe7981e45ddd1047cd47f6d79c971..9ae141d30fc2ab51a19890b1f7c59bb8ac05fa8b 100644 (file)
@@ -1038,7 +1038,7 @@ msgstr "Jappix doit pouvoir écrire dans ce dossier pour y créer ses sous-répe
 msgid "The folder is writable, you can continue!"
 msgstr "Le dossier peut être écrit, vous pouvez continuer !"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
 msgstr "Jappix vous offre la possibilité de gérer votre configuration, installer des nouveaux modules et rechercher des mises à jour. C'est pourquoi vous devez créer un compte administrateur pour accéder au gestionnaire."
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
index 89e5157769b76ff17407e5d42a5e35e0d9882879..1ab5c9591ab535212829853813059ba74e9442b3 100644 (file)
@@ -1038,7 +1038,7 @@ msgstr "A Jappix-nak tudnia kell írni ebbe a mappába, hogy létre tudjon hozni
 msgid "The folder is writable, you can continue!"
 msgstr "A mappa írható, már folytathatod!"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
 msgstr "Jappix felajánlja a lehetőséget, hogy menedzseld a konfigurációd, telepíts új kiegészítőket, vagy keress frissítéseket. Ezért kell létrehoznod egy adminisztrátori fiókot, hogy hozzáférj ezekhez a beállításokhoz."
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
index 5c7f5ae56867a51c39519bd1d82558df83b0e7df..189a3c9485677bf9121165f54324ce8db2305d53 100644 (file)
@@ -1038,8 +1038,8 @@ msgstr "Jappix harus mampu menulis dalam folder ini untuk membuat sub-direktori.
 msgid "The folder is writable, you can continue!"
 msgstr "Folder dapat ditulis, anda dapat melanjutkan!"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix menawarkan kemungkinan untuk mengelola konfigurasi anda, menginstal plugin baru atau mencari update. Itulah mengapa anda harus membuat account administrator untuk mengakses manajer."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix menawarkan kemungkinan untuk mengelola konfigurasi anda, menginstal addon baru atau mencari update. Itulah mengapa anda harus membuat account administrator untuk mengakses manajer."
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
 msgstr "Ketika Jappix akan diinstal, cukup klik pada link manajer di halaman rumah untuk mengaksesnya."
index 092cc8fb5c5f63515a9aa1977c2ce726ac31d543..a1726a54d16251bd65870cbb81c24de2f239572a 100644 (file)
@@ -1038,8 +1038,8 @@ msgstr "Jappix deve avere le autorizzazioni adeguate per scrivere in questa cart
 msgid "The folder is writable, you can continue!"
 msgstr "La directory è scrivibile, puoi continuare!"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix ti offre la possibilità controllare la configurazione di Jappix, installare nuove plugins e cercare aggiornamenti. Ecco perchè devi creare un account amministrativo per accedere all'Amministrazione."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix ti offre la possibilità controllare la configurazione di Jappix, installare nuove addons e cercare aggiornamenti. Ecco perchè devi creare un account amministrativo per accedere all'Amministrazione."
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
 msgstr "Quando Jappix sarà installato, semplicemente clicca sul link “Amministrazione” nella home page per accedervi."
index bc1751f45d89375d12412866f3f059d16e8073b5..b296135f45169391d5b42270f15cf9d05f84272b 100644 (file)
@@ -1038,7 +1038,7 @@ msgstr "サブフォルダを書き込む権限が必要です。%1sに権限を
 msgid "The folder is writable, you can continue!"
 msgstr "フォルダは書き込み可能です。続けてください。"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
 msgstr "Jappixは、設定ファイル、新しいプラグイン、アップデートを提供できます。管理者権限でのアクセスが必要です。"
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
index e85c315cf9087bf532ba4cca67bd37fe0c5ba0c7..9ce3a85645649b2656a338090dd00077aaa871d8 100644 (file)
@@ -1038,7 +1038,7 @@ msgstr ""
 msgid "The folder is writable, you can continue!"
 msgstr ""
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
 msgstr ""
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
index 1f2d628709b01eb6583a284ab181cba81944c364..f74d43616ce2f64e81ede3c2d74d74ea7d1c8406 100644 (file)
@@ -1038,7 +1038,7 @@ msgstr ""
 msgid "The folder is writable, you can continue!"
 msgstr ""
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
 msgstr ""
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
index 58bdb62fccef82eafcc154608f6b145ded6b3007..f0fa0316bfe2674cce290518103cee53946db3b3 100644 (file)
@@ -1038,8 +1038,8 @@ msgstr "Jappix musi mieć możliwość zapisu w tym folderze aby móc stworzyć
 msgid "The folder is writable, you can continue!"
 msgstr "Można zapisywać w folderze, możesz kontynuować!"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix oferuje Ci możliwość zarządzania konfiguracją, instalacji nowych pluginów lub sprawdzania aktualizacji. To właśnie dlatego musisz stworzyć konto administratora."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix oferuje Ci możliwość zarządzania konfiguracją, instalacji nowych addonów lub sprawdzania aktualizacji. To właśnie dlatego musisz stworzyć konto administratora."
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
 msgstr "Kiedy Jappix będzie już zainstalowany, kliknij w link Menedżer na stronie głównej."
index deef5ba81a2cfa4d8f20bfbb71eae76f57cdbccf..3541dda446c1b736b0976f92b47ef48d85c549ac 100644 (file)
@@ -1038,8 +1038,8 @@ msgstr "Jappix precisa permissão para escrita nessa pasta. Se não, você preci
 msgid "The folder is writable, you can continue!"
 msgstr "Esta pasta possui permissão de escrita, pode continuar!"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix oferece a você a possibilidade de gerenciar suas configurações, instalar novos plugins ou procurar por atulizações. Por isso você deve criar um usuário de administração para acessar o gerenciador."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix oferece a você a possibilidade de gerenciar suas configurações, instalar novos addons ou procurar por atulizações. Por isso você deve criar um usuário de administração para acessar o gerenciador."
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
 msgstr "Quando o Jappix for instalado, clique no link do gerenciador, em sua página inicial, para acessá-lo."
index 88b4a2d08faa28a373892ba58287741f2c242667..8ca7f6503e331f425f4572338c3c074718d7f3ac 100644 (file)
@@ -1038,7 +1038,7 @@ msgstr "Jappix должен иметь возможность записыват
 msgid "The folder is writable, you can continue!"
 msgstr "Папка доступна для записи, можно продолжать!"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
 msgstr "Jabbix позволяет вам управлять конфигурацией, устанавливать новые плагины или проверять обновления. Для доступа к панели управления требуется создать учетную запись администратора."
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
index d9c24be299978f394ad8e089ea2212380930fd72..846e639b709bd91dd1b0bc3fed382586059f0368 100644 (file)
@@ -1038,8 +1038,8 @@ msgstr "Jappix musí mať právo zapisovať v tejto zložke pre vytvorenie svoji
 msgid "The folder is writable, you can continue!"
 msgstr "Do zložky je možné zapisovať, môžete pokračovať!"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
-msgstr "Jappix vám ponúka možnosť spravovať vaše konfiguráciu, inštalovať nové pluginy alebo vyhľadať aktualizácie. Preto si musíte vytvoriť administračný účet pre prístup k Správcovi."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
+msgstr "Jappix vám ponúka možnosť spravovať vaše konfiguráciu, inštalovať nové addony alebo vyhľadať aktualizácie. Preto si musíte vytvoriť administračný účet pre prístup k Správcovi."
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
 msgstr "Po nainštalovaní Jappix, stačí kliknúť na odkaz Správca na domovskej stránke pre prístup."
index d7910185dcc3b05b0b0a6acf76a2a7c328243c0c..255b86f511561cc84ab51c23f2782aeab1ce791c 100644 (file)
@@ -1038,7 +1038,7 @@ msgstr ""
 msgid "The folder is writable, you can continue!"
 msgstr "Mappen är skrivbar -- du kan nu fortsätta!"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
 msgstr ""
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
index e5a39e0b1bdd2b270f2fae985ddf161d5d872351..79e8f2ba7ce88ab39703d511337e9cdfead0367e 100644 (file)
@@ -1038,7 +1038,7 @@ msgstr ""
 msgid "The folder is writable, you can continue!"
 msgstr ""
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
 msgstr ""
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
index 6ae04497bfe4ab1572ae81016dd6ee8f1a9a1f88..33c1f821e530104295ff82f88f8e563ee4ef206a 100644 (file)
@@ -1038,7 +1038,7 @@ msgstr ""
 msgid "The folder is writable, you can continue!"
 msgstr "資料夾可寫入,你可以繼續!"
 
-msgid "Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."
+msgid "Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."
 msgstr ""
 
 msgid "When Jappix will be installed, just click on the manager link on the home page to access it."
index ae0ff70d3150671e0b5357667e932124b1ca900e..9cce271365737488bb4f466c9e8b837e434e257f 100644 (file)
@@ -163,7 +163,7 @@ else
                        else if($step == 3) { ?>
                                <h3 class="account  install-images"><?php _e("Administrator account"); ?></h3>
                                
-                               <p><?php _e("Jappix offers you the possibility to manage your configuration, install new plugins or search for updates. That's why you must create an administrator account to access the manager."); ?></p>
+                               <p><?php _e("Jappix offers you the possibility to manage your configuration, install new addons or search for updates. That's why you must create an administrator account to access the manager."); ?></p>
                                
                                <p><?php _e("When Jappix will be installed, just click on the manager link on the home page to access it."); ?></p>
                                
index 370d2c7b7e6a1d550db0fb7656a2488f10298e98..fb9034935dcdb0c3ef4751263417d3815ef0a0dd 100644 (file)
@@ -61,19 +61,26 @@ GET /jappixmini/?role=%s&signed_address=%s&dfrn_id=%s
 Response:
 json({"status":"ok", "encrypted_address":"%s"})
 
-*/
+use Friendica\App;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Model\User;
+use Friendica\Util\Network;
 
-function jappixmini_install() {
-register_hook('plugin_settings', 'addon/jappixmini/jappixmini.php', 'jappixmini_settings');
-register_hook('plugin_settings_post', 'addon/jappixmini/jappixmini.php', 'jappixmini_settings_post');
+function jappixmini_install()
+{
+       Addon::registerHook('addon_settings', 'addon/jappixmini/jappixmini.php', 'jappixmini_settings');
+       Addon::registerHook('addon_settings_post', 'addon/jappixmini/jappixmini.php', 'jappixmini_settings_post');
 
-register_hook('page_end', 'addon/jappixmini/jappixmini.php', 'jappixmini_script');
-register_hook('authenticate', 'addon/jappixmini/jappixmini.php', 'jappixmini_login');
+       Addon::registerHook('page_end', 'addon/jappixmini/jappixmini.php', 'jappixmini_script');
+       Addon::registerHook('authenticate', 'addon/jappixmini/jappixmini.php', 'jappixmini_login');
 
-register_hook('cron', 'addon/jappixmini/jappixmini.php', 'jappixmini_cron');
+       Addon::registerHook('cron', 'addon/jappixmini/jappixmini.php', 'jappixmini_cron');
 
-// Jappix source download as required by AGPL
-register_hook('about_hook', 'addon/jappixmini/jappixmini.php', 'jappixmini_download_source');
+       // Jappix source download as required by AGPL
+       Addon::registerHook('about_hook', 'addon/jappixmini/jappixmini.php', 'jappixmini_download_source');
 
 // set standard configuration
 $info_text = get_config("jappixmini", "infotext");
@@ -92,20 +99,21 @@ $addon_version = get_config("jappixmini", "version");
 if ($addon_version==="") set_config("jappixmini", "version", "1");
 }
 
+function jappixmini_uninstall()
+{
+       Addon::unregisterHook('addon_settings', 'addon/jappixmini/jappixmini.php', 'jappixmini_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/jappixmini/jappixmini.php', 'jappixmini_settings_post');
 
-function jappixmini_uninstall() {
-unregister_hook('plugin_settings', 'addon/jappixmini/jappixmini.php', 'jappixmini_settings');
-unregister_hook('plugin_settings_post', 'addon/jappixmini/jappixmini.php', 'jappixmini_settings_post');
-
-unregister_hook('page_end', 'addon/jappixmini/jappixmini.php', 'jappixmini_script');
-unregister_hook('authenticate', 'addon/jappixmini/jappixmini.php', 'jappixmini_login');
+       Addon::unregisterHook('page_end', 'addon/jappixmini/jappixmini.php', 'jappixmini_script');
+       Addon::unregisterHook('authenticate', 'addon/jappixmini/jappixmini.php', 'jappixmini_login');
 
-unregister_hook('cron', 'addon/jappixmini/jappixmini.php', 'jappixmini_cron');
+       Addon::unregisterHook('cron', 'addon/jappixmini/jappixmini.php', 'jappixmini_cron');
 
-unregister_hook('about_hook', 'addon/jappixmini/jappixmini.php', 'jappixmini_download_source');
+       Addon::unregisterHook('about_hook', 'addon/jappixmini/jappixmini.php', 'jappixmini_download_source');
 }
 
-function jappixmini_plugin_admin(&$a, &$o) {
+function jappixmini_addon_admin(App $a, &$o)
+{
        // display instructions and warnings on addon settings page for admin
 
        if (!file_exists("addon/jappixmini.tgz")) {
@@ -147,7 +155,8 @@ function jappixmini_plugin_admin(&$a, &$o) {
        $o .= '<input type="submit" name="jappixmini-admin-settings" value="OK" />';
 }
 
-function jappixmini_plugin_admin_post(&$a) {
+function jappixmini_addon_admin_post(App $a)
+{
        // set info text
        $submit = $_REQUEST['jappixmini-admin-settings'];
        if ($submit) {
@@ -210,9 +219,11 @@ function jappixmini_init(&$a) {
        } catch (Exception $e) {
        }
 
-       // do not return an address if user deactivated plugin
-       $activated = get_pconfig($uid, 'jappixmini', 'activate');
-       if (!$activated) killme();
+       // do not return an address if user deactivated addon
+       $activated = PConfig::get($uid, 'jappixmini', 'activate');
+       if (!$activated) {
+               killme();
+       }
 
        // return the requested Jabber address
        try {
@@ -238,118 +249,128 @@ function jappixmini_init(&$a) {
        }
 }
 
-function jappixmini_settings(&$a, &$s) {
-    // addon settings for a user
+function jappixmini_settings(App $a, &$s)
+{
+       // addon settings for a user
+       $activate = PConfig::get(local_user(), 'jappixmini', 'activate');
+       $activate = intval($activate) ? ' checked="checked"' : '';
+       $dontinsertchat = PConfig::get(local_user(), 'jappixmini', 'dontinsertchat');
+       $insertchat = !(intval($dontinsertchat) ? ' checked="checked"' : '');
 
-    $activate = get_pconfig(local_user(),'jappixmini','activate');
-    $activate = intval($activate) ? ' checked="checked"' : '';
-    $dontinsertchat = get_pconfig(local_user(),'jappixmini','dontinsertchat');
-    $insertchat = !(intval($dontinsertchat) ? ' checked="checked"' : '');
+       $defaultbosh = Config::get("jappixmini", "bosh_address");
 
-    $defaultbosh = get_config("jappixmini", "bosh_address");
-
-    if ($defaultbosh != "")
-       set_pconfig(local_user(),'jappixmini','bosh', $defaultbosh);
+       if ($defaultbosh != "") {
+               PConfig::set(local_user(), 'jappixmini', 'bosh', $defaultbosh);
+       }
 
-    $username = get_pconfig(local_user(),'jappixmini','username');
-    $username = htmlentities($username);
-    $server = get_pconfig(local_user(),'jappixmini','server');
-    $server = htmlentities($server);
-    $bosh = get_pconfig(local_user(),'jappixmini','bosh');
-    $bosh = htmlentities($bosh);
-    $password = get_pconfig(local_user(),'jappixmini','password');
-    $autosubscribe = get_pconfig(local_user(),'jappixmini','autosubscribe');
-    $autosubscribe = intval($autosubscribe) ? ' checked="checked"' : '';
-    $autoapprove = get_pconfig(local_user(),'jappixmini','autoapprove');
-    $autoapprove = intval($autoapprove) ? ' checked="checked"' : '';
-    $encrypt = intval(get_pconfig(local_user(),'jappixmini','encrypt'));
-    $encrypt_checked = $encrypt ? ' checked="checked"' : '';
-    $encrypt_disabled = $encrypt ? '' : ' disabled="disabled"';
+       $username = PConfig::get(local_user(), 'jappixmini', 'username');
+       $username = htmlentities($username);
+       $server = PConfig::get(local_user(), 'jappixmini', 'server');
+       $server = htmlentities($server);
+       $bosh = PConfig::get(local_user(), 'jappixmini', 'bosh');
+       $bosh = htmlentities($bosh);
+       $password = PConfig::get(local_user(), 'jappixmini', 'password');
+       $autosubscribe = PConfig::get(local_user(), 'jappixmini', 'autosubscribe');
+       $autosubscribe = intval($autosubscribe) ? ' checked="checked"' : '';
+       $autoapprove = PConfig::get(local_user(), 'jappixmini', 'autoapprove');
+       $autoapprove = intval($autoapprove) ? ' checked="checked"' : '';
+       $encrypt = intval(PConfig::get(local_user(), 'jappixmini', 'encrypt'));
+       $encrypt_checked = $encrypt ? ' checked="checked"' : '';
+       $encrypt_disabled = $encrypt ? '' : ' disabled="disabled"';
+
+       if ($server == "") {
+               $server = Config::get("jappixmini", "default_server");
+       }
 
-    if ($server == "")
-       $server = get_config("jappixmini", "default_server");
+       if (($username == "") && Config::get("jappixmini", "default_user")) {
+               $username = $a->user["nickname"];
+       }
 
-    if (($username == "") && get_config("jappixmini", "default_user"))
-       $username = $a->user["nickname"];
+       $info_text = Config::get("jappixmini", "infotext");
+       $info_text = htmlentities($info_text);
+       $info_text = str_replace("\n", "<br />", $info_text);
 
-    $info_text = get_config("jappixmini", "infotext");
-    $info_text = htmlentities($info_text);
-    $info_text = str_replace("\n", "<br />", $info_text);
+       // count contacts
+       $r = q("SELECT COUNT(1) as `cnt` FROM `pconfig` WHERE `uid`=%d AND `cat`='jappixmini' AND `k` LIKE 'id:%%'", local_user());
+       if (count($r)) {
+               $contact_cnt = $r[0]["cnt"];
+       } else {
+               $contact_cnt = 0;
+       }
 
-    // count contacts
-    $r = q("SELECT COUNT(1) as `cnt` FROM `pconfig` WHERE `uid`=%d AND `cat`='jappixmini' AND `k` LIKE 'id:%%'", local_user());
-    if (count($r)) $contact_cnt = $r[0]["cnt"];
-    else $contact_cnt = 0;
+       // count jabber addresses
+       $r = q("SELECT COUNT(1) as `cnt` FROM `pconfig` WHERE `uid`=%d AND `cat`='jappixmini' AND `k` LIKE 'id:%%' AND `v` LIKE '%%@%%'", local_user());
+       if (count($r)) {
+               $address_cnt = $r[0]["cnt"];
+       } else {
+               $address_cnt = 0;
+       }
 
-    // count jabber addresses
-    $r = q("SELECT COUNT(1) as `cnt` FROM `pconfig` WHERE `uid`=%d AND `cat`='jappixmini' AND `k` LIKE 'id:%%' AND `v` LIKE '%%@%%'", local_user());
-    if (count($r)) $address_cnt = $r[0]["cnt"];
-    else $address_cnt = 0;
+       if (!$activate) {
+               // load scripts if not yet activated so that password can be saved
+               $a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/jappix/php/get.php?t=js&amp;g=mini.xml"></script>' . "\r\n";
+               $a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/jappix/php/get.php?t=js&amp;f=presence.js~caps.js~name.js~roster.js"></script>' . "\r\n";
 
-    if (!$activate) {
-       // load scripts if not yet activated so that password can be saved
-        $a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/jappix/php/get.php?t=js&amp;g=mini.xml"></script>'."\r\n";
-        $a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/jappix/php/get.php?t=js&amp;f=presence.js~caps.js~name.js~roster.js"></script>'."\r\n";
+               $a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/lib.js"></script>' . "\r\n";
+       }
 
-        $a->page['htmlhead'] .= '<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/jappixmini/lib.js"></script>'."\r\n";
-    }
+       $s .= '<span id="settings_jappixmini_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_jappixmini_expanded\'); openClose(\'settings_jappixmini_inflated\');">';
+       $s .= '<h3>' . L10n::t('Jappix Mini') . '</h3>';
+       $s .= '</span>';
+       $s .= '<div id="settings_jappixmini_expanded" class="settings-block" style="display: none;">';
+       $s .= '<span class="fakelink" onclick="openClose(\'settings_jappixmini_expanded\'); openClose(\'settings_jappixmini_inflated\');">';
+       $s .= '<h3>' . L10n::t('Jappix Mini') . '</h3>';
+       $s .= '</span>';
 
-    $s .= '<span id="settings_jappixmini_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_jappixmini_expanded\'); openClose(\'settings_jappixmini_inflated\');">';
-    $s .= '<h3>'.t('Jappix Mini').'</h3>';
-    $s .= '</span>';
-    $s .= '<div id="settings_jappixmini_expanded" class="settings-block" style="display: none;">';
-    $s .= '<span class="fakelink" onclick="openClose(\'settings_jappixmini_expanded\'); openClose(\'settings_jappixmini_inflated\');">';
-    $s .= '<h3>'.t('Jappix Mini').'</h3>';
-    $s .= '</span>';
-
-    $s .= '<label for="jappixmini-activate">'.t('Activate addon').'</label>';
-    $s .= ' <input id="jappixmini-activate" type="checkbox" name="jappixmini-activate" value="1"'.$activate.' />';
-    $s .= '<br />';
-    $s .= '<label for"jappixmini-dont-insertchat">'.t('Do <em>not</em> insert the Jappixmini Chat-Widget into the webinterface').'</label>';
-    $s .= '<input id="jappixmini-dont-insertchat" type="checkbox" name="jappixmini-dont-insertchat" value="1"'.$insertchat.' />';
-    $s .= '<br />';
-    $s .= '<label for="jappixmini-username">'.t('Jabber username').'</label>';
-    $s .= ' <input id="jappixmini-username" type="text" name="jappixmini-username" value="'.$username.'" />';
-    $s .= '<br />';
-    $s .= '<label for="jappixmini-server">'.t('Jabber server').'</label>';
-    $s .= ' <input id="jappixmini-server" type="text" name="jappixmini-server" value="'.$server.'" />';
-    $s .= '<br />';
-
-    if ($defaultbosh == "") {
-       $s .= '<label for="jappixmini-bosh">'.t('Jabber BOSH host').'</label>';
-       $s .= ' <input id="jappixmini-bosh" type="text" name="jappixmini-bosh" value="'.$bosh.'" />';
+       $s .= '<label for="jappixmini-activate">' . L10n::t('Activate addon') . '</label>';
+       $s .= ' <input id="jappixmini-activate" type="checkbox" name="jappixmini-activate" value="1"' . $activate . ' />';
+       $s .= '<br />';
+       $s .= '<label for"jappixmini-dont-insertchat">' . L10n::t('Do <em>not</em> insert the Jappixmini Chat-Widget into the webinterface') . '</label>';
+       $s .= '<input id="jappixmini-dont-insertchat" type="checkbox" name="jappixmini-dont-insertchat" value="1"' . $insertchat . ' />';
+       $s .= '<br />';
+       $s .= '<label for="jappixmini-username">' . L10n::t('Jabber username') . '</label>';
+       $s .= ' <input id="jappixmini-username" type="text" name="jappixmini-username" value="' . $username . '" />';
+       $s .= '<br />';
+       $s .= '<label for="jappixmini-server">' . L10n::t('Jabber server') . '</label>';
+       $s .= ' <input id="jappixmini-server" type="text" name="jappixmini-server" value="' . $server . '" />';
        $s .= '<br />';
-    }
 
+       if ($defaultbosh == "") {
+               $s .= '<label for="jappixmini-bosh">' . L10n::t('Jabber BOSH host') . '</label>';
+               $s .= ' <input id="jappixmini-bosh" type="text" name="jappixmini-bosh" value="' . $bosh . '" />';
+               $s .= '<br />';
+       }
 
-    $s .= '<label for="jappixmini-password">'.t('Jabber password').'</label>';
-    $s .= ' <input type="hidden" id="jappixmini-password" name="jappixmini-encrypted-password" value="'.$password.'" />';
-    $s .= ' <input id="jappixmini-clear-password" type="password" value="" onchange="jappixmini_set_password();" />';
-    $s .= '<br />';
-    $onchange = "document.getElementById('jappixmini-friendica-password').disabled = !this.checked;jappixmini_set_password();";
-    $s .= '<label for="jappixmini-encrypt">'.t('Encrypt Jabber password with Friendica password (recommended)').'</label>';
-    $s .= ' <input id="jappixmini-encrypt" type="checkbox" name="jappixmini-encrypt" onchange="'.$onchange.'" value="1"'.$encrypt_checked.' />';
-    $s .= '<br />';
-    $s .= '<label for="jappixmini-friendica-password">'.t('Friendica password').'</label>';
-    $s .= ' <input id="jappixmini-friendica-password" name="jappixmini-friendica-password" type="password" onchange="jappixmini_set_password();" value=""'.$encrypt_disabled.' />';
-    $s .= '<br />';
-    $s .= '<label for="jappixmini-autoapprove">'.t('Approve subscription requests from Friendica contacts automatically').'</label>';
-    $s .= ' <input id="jappixmini-autoapprove" type="checkbox" name="jappixmini-autoapprove" value="1"'.$autoapprove.' />';
-    $s .= '<br />';
-    $s .= '<label for="jappixmini-autosubscribe">'.t('Subscribe to Friendica contacts automatically').'</label>';
-    $s .= ' <input id="jappixmini-autosubscribe" type="checkbox" name="jappixmini-autosubscribe" value="1"'.$autosubscribe.' />';
-    $s .= '<br />';
-    $s .= '<label for="jappixmini-purge">'.t('Purge internal list of jabber addresses of contacts').'</label>';
-    $s .= ' <input id="jappixmini-purge" type="checkbox" name="jappixmini-purge" value="1" />';
-    $s .= '<br />';
-    if ($info_text) $s .= '<br />Configuration help:<p style="margin-left:2em;">'.$info_text.'</p>';
-    $s .= '<br />Status:<p style="margin-left:2em;">Addon knows '.$address_cnt.' Jabber addresses of '.$contact_cnt.' Friendica contacts (takes some time, usually 10 minutes, to update).</p>';
-    $s .= '<input type="submit" name="jappixmini-submit" value="' . t('Save Settings') . '" />';
-    $s .= ' <input type="button" value="'.t('Add contact').'" onclick="jappixmini_addon_subscribe();" />';
-
-    $s .= '</div>';
+       $s .= '<label for="jappixmini-password">' . L10n::t('Jabber password') . '</label>';
+       $s .= ' <input type="hidden" id="jappixmini-password" name="jappixmini-encrypted-password" value="' . $password . '" />';
+       $s .= ' <input id="jappixmini-clear-password" type="password" value="" onchange="jappixmini_set_password();" />';
+       $s .= '<br />';
+       $onchange = "document.getElementById('jappixmini-friendica-password').disabled = !this.checked;jappixmini_set_password();";
+       $s .= '<label for="jappixmini-encrypt">' . L10n::t('Encrypt Jabber password with Friendica password (recommended)') . '</label>';
+       $s .= ' <input id="jappixmini-encrypt" type="checkbox" name="jappixmini-encrypt" onchange="' . $onchange . '" value="1"' . $encrypt_checked . ' />';
+       $s .= '<br />';
+       $s .= '<label for="jappixmini-friendica-password">' . L10n::t('Friendica password') . '</label>';
+       $s .= ' <input id="jappixmini-friendica-password" name="jappixmini-friendica-password" type="password" onchange="jappixmini_set_password();" value=""' . $encrypt_disabled . ' />';
+       $s .= '<br />';
+       $s .= '<label for="jappixmini-autoapprove">' . L10n::t('Approve subscription requests from Friendica contacts automatically') . '</label>';
+       $s .= ' <input id="jappixmini-autoapprove" type="checkbox" name="jappixmini-autoapprove" value="1"' . $autoapprove . ' />';
+       $s .= '<br />';
+       $s .= '<label for="jappixmini-autosubscribe">' . L10n::t('Subscribe to Friendica contacts automatically') . '</label>';
+       $s .= ' <input id="jappixmini-autosubscribe" type="checkbox" name="jappixmini-autosubscribe" value="1"' . $autosubscribe . ' />';
+       $s .= '<br />';
+       $s .= '<label for="jappixmini-purge">' . L10n::t('Purge internal list of jabber addresses of contacts') . '</label>';
+       $s .= ' <input id="jappixmini-purge" type="checkbox" name="jappixmini-purge" value="1" />';
+       $s .= '<br />';
+       if ($info_text) {
+               $s .= '<br />Configuration help:<p style="margin-left:2em;">' . $info_text . '</p>';
+       }
+       $s .= '<br />Status:<p style="margin-left:2em;">Addon knows ' . $address_cnt . ' Jabber addresses of ' . $contact_cnt . ' Friendica contacts (takes some time, usually 10 minutes, to update).</p>';
+       $s .= '<input type="submit" name="jappixmini-submit" value="' . L10n::t('Save Settings') . '" />';
+       $s .= ' <input type="button" value="' . L10n::t('Add contact') . '" onclick="jappixmini_addon_subscribe();" />';
 
-    $a->page['htmlhead'] .= "<script type=\"text/javascript\">
+       $s .= '</div>';
+
+       $a->page['htmlhead'] .= "<script type=\"text/javascript\">
         function jappixmini_set_password() {
             encrypt = document.getElementById('jappixmini-encrypt').checked;
             password = document.getElementById('jappixmini-password');
@@ -607,7 +628,7 @@ function jappixmini_cron(&$a, $d) {
 
                        try {
                                // send request
-                               $answer_json = fetch_url($url);
+                               $answer_json = Network::fetchUrl($url);
 
                                // parse answer
                                $answer = json_decode($answer_json);
index 7e4eb1f6f8e9ccf7c15c86c6555f3301f893961c..620e1db8f65cdb422e2b628241c47ff5e141301b 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:18+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index c107bf1229e2e52bebbf2f2fe89d05cf08738832..4c30eaa65be5d7bb016b47c5635b1cde040b0bbf 100644 (file)
@@ -1,6 +1,6 @@
 [donation_link]: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=3PMY37SL9L888&lc=US&item_name=JavaScript%20file%20uploader&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted
 
-This plugin uses XHR for uploading multiple files with progress-bar in FF3.6+, Safari4+,
+This addon uses XHR for uploading multiple files with progress-bar in FF3.6+, Safari4+,
 Chrome and falls back to hidden iframe based upload in other browsers,
 providing good user experience everywhere.
 
@@ -17,13 +17,13 @@ providing good user experience everywhere.
 * tested in IE7,8; Firefox 3,3.6,4; Safari4,5; Chrome; Opera10.60;
 
 ### License ###
-This plugin is open sourced under <a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPL 2</a> or later.
+This addon is open sourced under <a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPL 2</a> or later.
 If this license doesn't suit you mail me at andrew (at) valums.com.
 
-Please [donate][donation_link] if you are willing to support the further development of file upload plugin.  
+Please [donate][donation_link] if you are willing to support the further development of file upload addon.  
 
 ### Known Issues ###
-Plugin breaks back button functionality in Opera.
+Addon breaks back button functionality in Opera.
        
 ### Getting started ###
 The fileuploader.js contains two classes that are meant to be used directly.
index 148fde313a43557d9b2068aa773c029127731590..e16ee2d074bf655754cb78685ef7262cae16615d 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Name: JS Uploader
  * Description: JavaScript photo/image uploader. Uses Valum 'qq' Uploader.
  * Module Author: Chris Case
  *
  */
-
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
 
 function js_upload_install() {
-       register_hook('photo_upload_form', 'addon/js_upload/js_upload.php', 'js_upload_form');
-       register_hook('photo_post_init',   'addon/js_upload/js_upload.php', 'js_upload_post_init');
-       register_hook('photo_post_file',   'addon/js_upload/js_upload.php', 'js_upload_post_file');
-       register_hook('photo_post_end',    'addon/js_upload/js_upload.php', 'js_upload_post_end');
+       Addon::registerHook('photo_upload_form', 'addon/js_upload/js_upload.php', 'js_upload_form');
+       Addon::registerHook('photo_post_init',   'addon/js_upload/js_upload.php', 'js_upload_post_init');
+       Addon::registerHook('photo_post_file',   'addon/js_upload/js_upload.php', 'js_upload_post_file');
+       Addon::registerHook('photo_post_end',    'addon/js_upload/js_upload.php', 'js_upload_post_end');
 }
 
 
 function js_upload_uninstall() {
-       unregister_hook('photo_upload_form', 'addon/js_upload/js_upload.php', 'js_upload_form');
-       unregister_hook('photo_post_init',   'addon/js_upload/js_upload.php', 'js_upload_post_init');
-       unregister_hook('photo_post_file',   'addon/js_upload/js_upload.php', 'js_upload_post_file');
-       unregister_hook('photo_post_end',    'addon/js_upload/js_upload.php', 'js_upload_post_end');
+       Addon::unregisterHook('photo_upload_form', 'addon/js_upload/js_upload.php', 'js_upload_form');
+       Addon::unregisterHook('photo_post_init',   'addon/js_upload/js_upload.php', 'js_upload_post_init');
+       Addon::unregisterHook('photo_post_file',   'addon/js_upload/js_upload.php', 'js_upload_post_file');
+       Addon::unregisterHook('photo_post_end',    'addon/js_upload/js_upload.php', 'js_upload_post_end');
 }
 
 
@@ -39,11 +40,11 @@ function js_upload_form(&$a,&$b) {
 
        $b['addon_text'] .= '<link href="' . $a->get_baseurl() . '/addon/js_upload/file-uploader/client/fileuploader.css" rel="stylesheet" type="text/css">';
        $b['addon_text'] .= '<script src="' . $a->get_baseurl() . '/addon/js_upload/file-uploader/client/fileuploader.js" type="text/javascript"></script>';
-   
-       $upload_msg = t('Upload a file');
-       $drop_msg = t('Drop files here to upload');
-       $cancel = t('Cancel');
-       $failed = t('Failed');
+
+       $upload_msg = L10n::t('Upload a file');
+       $drop_msg = L10n::t('Drop files here to upload');
+       $cancel = L10n::t('Cancel');
+       $failed = L10n::t('Failed');
 
        $maximagesize = intval(get_config('system','maximagesize'));
 
@@ -300,25 +301,25 @@ class qqFileUploader {
     function handleUpload(){
         
         if (!$this->file){
-            return array('error' => t('No files were uploaded.'));
+            return ['error' => L10n::t('No files were uploaded.')];
         }
         
         $size = $this->file->getSize();
         
         if ($size == 0) {
-            return array('error' => t('Uploaded file is empty'));
+            return ['error' => L10n::t('Uploaded file is empty')];
         }
         
 //        if ($size > $this->sizeLimit) {
 
-//            return array('error' => t('Uploaded file is too large'));
+//            return array('error' => L10n::t('Uploaded file is too large'));
 //        }
         
 
                $maximagesize = get_config('system','maximagesize');
 
                if(($maximagesize) && ($size > $maximagesize)) {
-                       return array('error' => t('Image exceeds size limit of ') . $maximagesize );
+                       return ['error' => L10n::t('Image exceeds size limit of ') . $maximagesize ];
 
                }
 
@@ -329,7 +330,7 @@ class qqFileUploader {
 
         if($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)){
             $these = implode(', ', $this->allowedExtensions);
-            return array('error' => t('File has an invalid extension, it should be one of ') . $these . '.');
+            return ['error' => L10n::t('File has an invalid extension, it should be one of ') . $these . '.'];
         }
         
         if ($this->file->save()){
@@ -339,9 +340,9 @@ class qqFileUploader {
                                'filename' => $filename . '.' . $ext
                        );
         } else {
-            return array(
-                               'error'=> t('Upload was cancelled, or server error encountered'),
-                               'path' => $this->file->getPath(), 
+            return [
+                               'error'=> L10n::t('Upload was cancelled, or server error encountered'),
+                               'path' => $this->file->getPath(),
                                'filename' => $filename . '.' . $ext
                        );
         }
index 5d8fe687576f043ea5adbfd9876941ddab70e4fa..e529fb543ac12d9ad1ee30fb4c664c7114a18d1a 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-09-10 12:26+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index de968713307ade91d098aba906632704596e7728..3f114073c8d300a1043ea06260e0596e10f46c44 100644 (file)
@@ -9,29 +9,31 @@
  *
  *"My body was my sacrifice... for my magic. This damage is permanent." - Raistlin Majere
  */
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 function krynn_install() {
 
        /**
-        * 
-        * Our demo plugin will attach in three places.
+        *
+        * Our demo addon will attach in three places.
         * The first is just prior to storing a local post.
         *
         */
 
-       register_hook('post_local', 'addon/krynn/krynn.php', 'krynn_post_hook');
+       Addon::registerHook('post_local', 'addon/krynn/krynn.php', 'krynn_post_hook');
 
        /**
         *
-        * Then we'll attach into the plugin settings page, and also the 
+        * Then we'll attach into the addon settings page, and also the
         * settings post hook so that we can create and update
         * user preferences.
         *
         */
 
-       register_hook('plugin_settings', 'addon/krynn/krynn.php', 'krynn_settings');
-       register_hook('plugin_settings_post', 'addon/krynn/krynn.php', 'krynn_settings_post');
+       Addon::registerHook('addon_settings', 'addon/krynn/krynn.php', 'krynn_settings');
+       Addon::registerHook('addon_settings_post', 'addon/krynn/krynn.php', 'krynn_settings_post');
 
        logger("installed krynn");
 }
@@ -47,9 +49,9 @@ function krynn_uninstall() {
         *
         */
 
-       unregister_hook('post_local',    'addon/krynn/krynn.php', 'krynn_post_hook');
-       unregister_hook('plugin_settings', 'addon/krynn/krynn.php', 'krynn_settings');
-       unregister_hook('plugin_settings_post', 'addon/krynn/krynn.php', 'krynn_settings_post');
+       Addon::unregisterHook('post_local',    'addon/krynn/krynn.php', 'krynn_post_hook');
+       Addon::unregisterHook('addon_settings', 'addon/krynn/krynn.php', 'krynn_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/krynn/krynn.php', 'krynn_settings_post');
 
 
        logger("removed krynn");
@@ -64,7 +66,7 @@ function krynn_post_hook($a, &$item) {
         * An item was posted on the local system.
         * We are going to look for specific items:
         *      - A status post by a profile owner
-        *      - The profile owner must have allowed our plugin
+        *      - The profile owner must have allowed our addon
         *
         */
 
@@ -125,7 +127,7 @@ function krynn_settings_post($a,$post) {
 
 /**
  *
- * Called from the Plugin Setting form. 
+ * Called from the addon Setting form.
  * Add our own settings info to the page.
  *
  */
@@ -150,23 +152,23 @@ function krynn_settings(&$a,&$s) {
        /* Add some HTML to the existing form */
 
     $s .= '<span id="settings_krynn_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_krynn_expanded\'); openClose(\'settings_krynn_inflated\');">';
-       $s .= '<h3>' . t('Krynn') . '</h3>';
+       $s .= '<h3>' . L10n::t('Krynn') . '</h3>';
        $s .= '</span>';
        $s .= '<div id="settings_krynn_expanded" class="settings-block" style="display: none;">';
        $s .= '<span class="fakelink" onclick="openClose(\'settings_krynn_expanded\'); openClose(\'settings_krynn_inflated\');">';
-       $s .= '<h3>' . t('Krynn') . '</h3>';
+       $s .= '<h3>' . L10n::t('Krynn') . '</h3>';
        $s .= '</span>';
 
 
     $s .= '<div class="settings-block">';
-       $s .= '<h3>' . t('Krynn Settings') . '</h3>';
+       $s .= '<h3>' . L10n::t('Krynn Settings') . '</h3>';
        $s .= '<div id="krynn-enable-wrapper">';
-       $s .= '<label id="krynn-enable-label" for="krynn-checkbox">' . t('Enable Krynn Plugin') . '</label>';
+       $s .= '<label id="krynn-enable-label" for="krynn-checkbox">' . L10n::t('Enable Krynn Addon') . '</label>';
        $s .= '<input id="krynn-checkbox" type="checkbox" name="krynn" value="1" ' . $checked . '/>';
         $s .= '</div><div class="clear"></div></div>';
        /* provide a submit button */
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="krynn-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="krynn-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
 }
 
index 0831b915ab6939af35ed105c59ccd4a88e554c2b..63255c9f35ad7c290403298f9e14483f46f87270 100644 (file)
@@ -22,7 +22,7 @@ msgid "Krynn Settings"
 msgstr ""
 
 #: krynn.php:152
-msgid "Enable Krynn Plugin"
+msgid "Enable Krynn Addon"
 msgstr ""
 
 #: krynn.php:158
index ec7bf80346c3044dc63d763ee7b2b843d14c27f0..d5e09e7e75a68e85ad3058d8fa1c6a9050dd29e4 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Krynn Settings"] = "Ajustos de Krynn";\r
-$a->strings["Enable Krynn Plugin"] = "Activa Plugin de Krynn";\r
+$a->strings["Enable Krynn Addon"] = "Activa Addon de Krynn";\r
 $a->strings["Submit"] = "Enviar";\r
index 69e803e3ba66f6151c81eea923ae62718385f182..abb6d5158a59cc264a7e3928e528c2b44d603b21 100644 (file)
@@ -24,8 +24,8 @@ msgid "Krynn Settings"
 msgstr "Krynn Nastavení"
 
 #: krynn.php:152
-msgid "Enable Krynn Plugin"
-msgstr "Povolit Krynn plugin"
+msgid "Enable Krynn Addon"
+msgstr "Povolit Krynn addon"
 
 #: krynn.php:158
 msgid "Submit"
index e725ffc3ed9af2f0e0e6303db9a707d4a0264ff8..76de5f7fedb404fdceb80125a8220bb74f420c8f 100644 (file)
@@ -6,5 +6,5 @@ function string_plural_select_cs($n){
 }}
 ;
 $a->strings["Krynn Settings"] = "Krynn Nastavení";
-$a->strings["Enable Krynn Plugin"] = "Povolit Krynn plugin";
+$a->strings["Enable Krynn Addon"] = "Povolit Krynn addon";
 $a->strings["Submit"] = "Odeslat";
index 12dceb31192eb5148da5d503db9b05fa568bb38d..7d3e6bbd4799f3337451219bf9414ec0109be29e 100644 (file)
@@ -25,8 +25,8 @@ msgid "Krynn Settings"
 msgstr "Planeten Einstellungen"
 
 #: Krynn.php:152
-msgid "Enable Krynn Plugin"
-msgstr "Planeten-Plugin aktivieren"
+msgid "Enable Krynn Addon"
+msgstr "Planeten-Addon aktivieren"
 
 #: Krynn.php:158
 msgid "Submit"
index 74b5e9f924c9c7019dfec611a06d24956864732d..d8a54083a59066d1e5b0a2a7e15bb95a2a1712fa 100644 (file)
@@ -6,5 +6,5 @@ function string_plural_select_de($n){
 }}
 ;
 $a->strings["Krynn Settings"] = "Krynn Einstellungen";
-$a->strings["Enable Krynn Plugin"] = "Krynn-Plugin aktivieren";
+$a->strings["Enable Krynn Addon"] = "Krynn-Addon aktivieren";
 $a->strings["Submit"] = "Senden";
index 8b8dd24af4b32a30102feda917e983fb146479ba..eae02345832a97d035a4fa6e27cfcb056ba5d9cf 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Krynn Settings"] = "Agordo pri Krynn";\r
-$a->strings["Enable Krynn Plugin"] = "Ŝalti la Krynn kromprogamon";\r
+$a->strings["Enable Krynn Addon"] = "Ŝalti la Krynn kromprogamon";\r
 $a->strings["Submit"] = "Sendi";\r
index e2015a3794c503ed152887de796ffea4023e08cf..a8690ef1e502b096ddf5d061de8ef011c7f8a018 100644 (file)
@@ -24,8 +24,8 @@ msgid "Krynn Settings"
 msgstr "Ajustes de Krynn"
 
 #: krynn.php:152
-msgid "Enable Krynn Plugin"
-msgstr "Habilitar Plugin de Krynn"
+msgid "Enable Krynn Addon"
+msgstr "Habilitar Addon de Krynn"
 
 #: krynn.php:158
 msgid "Submit"
index 77df4d4e67e1f6b66d20f48a0979ae4b84fbaa7c..6bb39518baf1b2487a11ac8427c122db0c4902b0 100644 (file)
@@ -6,5 +6,5 @@ function string_plural_select_es($n){
 }}
 ;
 $a->strings["Krynn Settings"] = "Ajustes de Krynn";
-$a->strings["Enable Krynn Plugin"] = "Habilitar Plugin de Krynn";
+$a->strings["Enable Krynn Addon"] = "Habilitar Addon de Krynn";
 $a->strings["Submit"] = "Enviar";
index 601f95021625cf8ed2465d75fb6630601f99ee8c..bcd3430bb9cbd066fcf7dfcfb1c77ab31677267a 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Krynn Settings"] = "Réglages des Krynn";\r
-$a->strings["Enable Krynn Plugin"] = "Activer Krynn";\r
+$a->strings["Enable Krynn Addon"] = "Activer Krynn";\r
 $a->strings["Submit"] = "Envoyer";\r
index 976a601e69a9fb9064b1fc3fb52853e6ebe5f7f3..11fd5b57a3cb2fc88b1c7ce54c0ac370c754b9e5 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Krynn Settings"] = "";\r
-$a->strings["Enable Krynn Plugin"] = "";\r
+$a->strings["Enable Krynn Addon"] = "";\r
 $a->strings["Submit"] = "Senda inn";\r
index 507fac5443bc5f9e7568605dbc2eb0e95d48de11..37eacb5479bd15662605a490e13435cc8ea7524c 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2015
+# fabrixxm <fabrix.xm@gmail.com>, 2015,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 11:55+0000\n"
+"PO-Revision-Date: 2018-03-19 13:22+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -24,8 +24,8 @@ msgid "Krynn Settings"
 msgstr "Impostazioni Krynn"
 
 #: krynn.php:152
-msgid "Enable Krynn Plugin"
-msgstr "Abilita plugin Krynn"
+msgid "Enable Krynn Addon"
+msgstr "Abilita componente aggiuntivo Krynn"
 
 #: krynn.php:158
 msgid "Submit"
index 7c9f5f114026c296523abcbfe165ec763b2d365e..9c6f59bed56e3cf9e045a78dcddd487f68696904 100644 (file)
@@ -6,5 +6,5 @@ function string_plural_select_it($n){
 }}
 ;
 $a->strings["Krynn Settings"] = "Impostazioni Krynn";
-$a->strings["Enable Krynn Plugin"] = "Abilita plugin Krynn";
+$a->strings["Enable Krynn Addon"] = "Abilita componente aggiuntivo Krynn";
 $a->strings["Submit"] = "Invia";
index 06ad32cb592dbbde64fe0b45f5982b2d9fd8a659..29bffb9a0ddb7240e83e99bffe155379dcc33b55 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Krynn Settings"] = "";\r
-$a->strings["Enable Krynn Plugin"] = "";\r
+$a->strings["Enable Krynn Addon"] = "";\r
 $a->strings["Submit"] = "Lagre";\r
index 239001b17742d300c7a6328efbdff8d5c72aff57..d77ed6c1fd771f3a426b0047b891077ea1357a7f 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Krynn Settings"] = "";\r
-$a->strings["Enable Krynn Plugin"] = "";\r
+$a->strings["Enable Krynn Addon"] = "";\r
 $a->strings["Submit"] = "Potwierdź";\r
index a3b2d663a8b08a72fa47414ab46fe4d9c83241f6..0b882a7152bd767d7510c4e980e8e36d1ea6fdc5 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Krynn Settings"] = "Configuração dos Krynn";\r
-$a->strings["Enable Krynn Plugin"] = "Habilita configuração dos Krynn";\r
+$a->strings["Enable Krynn Addon"] = "Habilita configuração dos Krynn";\r
 $a->strings["Submit"] = "Enviar";\r
index 2e629e1cee559229071208681294fdeed4510407..8f945315548c812101aab5735f3194acd0a0010d 100644 (file)
@@ -24,7 +24,7 @@ msgid "Krynn Settings"
 msgstr "Configurări Krynn"
 
 #: krynn.php:152
-msgid "Enable Krynn Plugin"
+msgid "Enable Krynn Addon"
 msgstr "Activare Modul Krynn"
 
 #: krynn.php:158
index 88a84ee890cf16b843f8a34046df974528cca701..f6c6f53d298b227568ff9d22307859f1f091ae6b 100644 (file)
@@ -6,5 +6,5 @@ function string_plural_select_ro($n){
 }}
 ;
 $a->strings["Krynn Settings"] = "Configurări Krynn";
-$a->strings["Enable Krynn Plugin"] = "Activare Modul Krynn";
+$a->strings["Enable Krynn Addon"] = "Activare Modul Krynn";
 $a->strings["Submit"] = "Trimite";
index 8fd1069bf76cd5b348c00a5ccc22d69c957a8f56..88ba671982e2574476fd855ec589c7d5d3b64bff 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Krynn Settings"] = "";\r
-$a->strings["Enable Krynn Plugin"] = "";\r
+$a->strings["Enable Krynn Addon"] = "";\r
 $a->strings["Submit"] = "Подтвердить";\r
index dcbfbeb731ed74a4819b42a351f83efd285a5322..5564f1f4488be1fb3c085c49dc433270831e0fe5 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Krynn Settings"] = "行星设置";\r
-$a->strings["Enable Krynn Plugin"] = "使行星插件可用";\r
+$a->strings["Enable Krynn Addon"] = "使行星插件可用";\r
 $a->strings["Submit"] = "提交";\r
index 6eded71faa2f985af674f558f6af9e2d8a16c7ca..452632dce3397e00bd69b73c1c7e694c2f4f3962 100644 (file)
@@ -11,7 +11,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2015-09-22 15:18+0200\n"
-"PO-Revision-Date: 2015-12-14 10:47+0000\n"
+"PO-Revision-Date: 2017-09-22 12:16+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
diff --git a/langfilter/lang/nl/messages.po b/langfilter/lang/nl/messages.po
new file mode 100644 (file)
index 0000000..28f7c8d
--- /dev/null
@@ -0,0 +1,70 @@
+# ADDON langfilter
+# Copyright (C)
+# This file is distributed under the same license as the Friendica langfilter addon package.
+# 
+# 
+# Translators:
+# Karel Vandecandelaere <karel@dasrakel.eu>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-09-22 15:18+0200\n"
+"PO-Revision-Date: 2018-03-20 13:46+0000\n"
+"Last-Translator: Karel Vandecandelaere <karel@dasrakel.eu>\n"
+"Language-Team: Dutch (http://www.transifex.com/Friendica/friendica/language/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: langfilter.php:44
+msgid "Language Filter"
+msgstr "Taalfilter"
+
+#: langfilter.php:45
+msgid ""
+"This addon tries to identify the language of a postings. If it does not "
+"match any language spoken by you (see below) the posting will be collapsed. "
+"Remember detecting the language is not perfect, especially with short "
+"postings."
+msgstr "Deze addon probeert de taal van berichten automatisch te bepalen. Als het niet overeenkomt met een taal die jij spreekt (zie verder) zal het bericht worden verborgen. Onthoudt hierbij wel dat taaldetectie niet perfect is, vooral bij korte berichten."
+
+#: langfilter.php:46
+msgid "Use the language filter"
+msgstr "Gebruik de taalfilter"
+
+#: langfilter.php:47
+msgid "I speak"
+msgstr "Ik spreek"
+
+#: langfilter.php:47
+msgid ""
+"List of abbreviations (iso2 codes) for languages you speak, comma separated."
+" For example \"de,it\"."
+msgstr "Lijst van afkortingen (ISO2 codes) voor talen die jij spreekt, door komma's gescheiden. Bijvoorbeeld \"de,it\"."
+
+#: langfilter.php:48
+msgid "Minimum confidence in language detection"
+msgstr ""
+
+#: langfilter.php:48
+msgid ""
+"Minimum confidence in language detection being correct, from 0 to 100. Posts"
+" will not be filtered when the confidence of language detection is below "
+"this percent value."
+msgstr ""
+
+#: langfilter.php:49
+msgid "Save Settings"
+msgstr "Instellingen opslaan"
+
+#: langfilter.php:73
+msgid "Language Filter Settings saved."
+msgstr "Taalfilter-instellingen bijgewerkt."
+
+#: langfilter.php:123
+#, php-format
+msgid "unspoken language %s - Click to open/close"
+msgstr "niet gesproken taal %s - Klik om open/dicht te klappen"
diff --git a/langfilter/lang/nl/strings.php b/langfilter/lang/nl/strings.php
new file mode 100644 (file)
index 0000000..17bb8d2
--- /dev/null
@@ -0,0 +1,17 @@
+<?php
+
+if(! function_exists("string_plural_select_nl")) {
+function string_plural_select_nl($n){
+       return ($n != 1);;
+}}
+;
+$a->strings["Language Filter"] = "Taalfilter";
+$a->strings["This addon tries to identify the language of a postings. If it does not match any language spoken by you (see below) the posting will be collapsed. Remember detecting the language is not perfect, especially with short postings."] = "Deze addon probeert de taal van berichten automatisch te bepalen. Als het niet overeenkomt met een taal die jij spreekt (zie verder) zal het bericht worden verborgen. Onthoudt hierbij wel dat taaldetectie niet perfect is, vooral bij korte berichten.";
+$a->strings["Use the language filter"] = "Gebruik de taalfilter";
+$a->strings["I speak"] = "Ik spreek";
+$a->strings["List of abbreviations (iso2 codes) for languages you speak, comma separated. For example \"de,it\"."] = "Lijst van afkortingen (ISO2 codes) voor talen die jij spreekt, door komma's gescheiden. Bijvoorbeeld \"de,it\".";
+$a->strings["Minimum confidence in language detection"] = "";
+$a->strings["Minimum confidence in language detection being correct, from 0 to 100. Posts will not be filtered when the confidence of language detection is below this percent value."] = "";
+$a->strings["Save Settings"] = "Instellingen opslaan";
+$a->strings["Language Filter Settings saved."] = "Taalfilter-instellingen bijgewerkt.";
+$a->strings["unspoken language %s - Click to open/close"] = "niet gesproken taal %s - Klik om open/dicht te klappen";
diff --git a/langfilter/lang/zh-cn/messages.po b/langfilter/lang/zh-cn/messages.po
new file mode 100644 (file)
index 0000000..ce18b53
--- /dev/null
@@ -0,0 +1,70 @@
+# ADDON langfilter
+# Copyright (C)
+# This file is distributed under the same license as the Friendica langfilter addon package.
+# 
+# 
+# Translators:
+# 朱陈锬 <tangenters@outlook.com>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-09-22 15:18+0200\n"
+"PO-Revision-Date: 2018-02-28 11:28+0000\n"
+"Last-Translator: 朱陈锬 <tangenters@outlook.com>\n"
+"Language-Team: Chinese (China) (http://www.transifex.com/Friendica/friendica/language/zh_CN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: langfilter.php:44
+msgid "Language Filter"
+msgstr ""
+
+#: langfilter.php:45
+msgid ""
+"This addon tries to identify the language of a postings. If it does not "
+"match any language spoken by you (see below) the posting will be collapsed. "
+"Remember detecting the language is not perfect, especially with short "
+"postings."
+msgstr ""
+
+#: langfilter.php:46
+msgid "Use the language filter"
+msgstr ""
+
+#: langfilter.php:47
+msgid "I speak"
+msgstr ""
+
+#: langfilter.php:47
+msgid ""
+"List of abbreviations (iso2 codes) for languages you speak, comma separated."
+" For example \"de,it\"."
+msgstr ""
+
+#: langfilter.php:48
+msgid "Minimum confidence in language detection"
+msgstr ""
+
+#: langfilter.php:48
+msgid ""
+"Minimum confidence in language detection being correct, from 0 to 100. Posts"
+" will not be filtered when the confidence of language detection is below "
+"this percent value."
+msgstr ""
+
+#: langfilter.php:49
+msgid "Save Settings"
+msgstr "保存设置"
+
+#: langfilter.php:73
+msgid "Language Filter Settings saved."
+msgstr ""
+
+#: langfilter.php:123
+#, php-format
+msgid "unspoken language %s - Click to open/close"
+msgstr ""
diff --git a/langfilter/lang/zh-cn/strings.php b/langfilter/lang/zh-cn/strings.php
new file mode 100644 (file)
index 0000000..75f6b6b
--- /dev/null
@@ -0,0 +1,17 @@
+<?php
+
+if(! function_exists("string_plural_select_zh_cn")) {
+function string_plural_select_zh_cn($n){
+       return 0;;
+}}
+;
+$a->strings["Language Filter"] = "";
+$a->strings["This addon tries to identify the language of a postings. If it does not match any language spoken by you (see below) the posting will be collapsed. Remember detecting the language is not perfect, especially with short postings."] = "";
+$a->strings["Use the language filter"] = "";
+$a->strings["I speak"] = "";
+$a->strings["List of abbreviations (iso2 codes) for languages you speak, comma separated. For example \"de,it\"."] = "";
+$a->strings["Minimum confidence in language detection"] = "";
+$a->strings["Minimum confidence in language detection being correct, from 0 to 100. Posts will not be filtered when the confidence of language detection is below this percent value."] = "";
+$a->strings["Save Settings"] = "保存设置";
+$a->strings["Language Filter Settings saved."] = "";
+$a->strings["unspoken language %s - Click to open/close"] = "";
index d4fe942d0b23c1fe19b44461d9aaa5fe8cc3d052..5df153eb978a1ce26bf99f8eeb90670231e44969 100644 (file)
@@ -7,21 +7,28 @@
  * License: MIT
  */
 
-require_once('library/langdet/Text/LanguageDetect.php');
+use Friendica\App;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 /* Define the hooks we want to use
  * that is, we have settings, we need to save the settings and we want
  * to modify the content of a posting when friendica prepares it.
  */
-function langfilter_install() {
-       register_hook('prepare_body',         'addon/langfilter/langfilter.php', 'langfilter_prepare_body', 10);
-       register_hook('plugin_settings',      'addon/langfilter/langfilter.php', 'langfilter_addon_settings');
-       register_hook('plugin_settings_post', 'addon/langfilter/langfilter.php', 'langfilter_addon_settings_post');
+
+function langfilter_install()
+{
+       Addon::registerHook('prepare_body', 'addon/langfilter/langfilter.php', 'langfilter_prepare_body', 10);
+       Addon::registerHook('addon_settings', 'addon/langfilter/langfilter.php', 'langfilter_addon_settings');
+       Addon::registerHook('addon_settings_post', 'addon/langfilter/langfilter.php', 'langfilter_addon_settings_post');
 }
-function langfilter_uninstall() {
-       unregister_hook('prepare_body',         'addon/langfilter/langfilter.php', 'langfilter_prepare_body');
-       unregister_hook('plugin_settings',      'addon/langfilter/langfilter.php', 'langfilter_addon_settings');
-       unregister_hook('plugin_settings_post', 'addon/langfilter/langfilter.php', 'langfilter_addon_settings_post');
+
+function langfilter_uninstall()
+{
+       Addon::unregisterHook('prepare_body', 'addon/langfilter/langfilter.php', 'langfilter_prepare_body');
+       Addon::unregisterHook('addon_settings', 'addon/langfilter/langfilter.php', 'langfilter_addon_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/langfilter/langfilter.php', 'langfilter_addon_settings_post');
 }
 
 /* The settings
@@ -40,16 +47,16 @@ function langfilter_addon_settings(&$a,&$s) {
        if(! $languages)
                $languages = 'en,de,fr,it,es';
 
-       $t = get_markup_template("settings.tpl", "addon/langfilter/" );
-       $s .= replace_macros ($t, array(
-           '$title' => t("Language Filter"),
-           '$intro' => t ('This addon tries to identify the language of a postings. If it does not match any language spoken by you (see below) the posting will be collapsed. Remember detecting the language is not perfect, especially with short postings.'),
-           '$enabled' => array('langfilter_enable', t('Use the language filter'), $enable_checked, ''),
-           '$languages' => array('langfilter_languages', t('I speak'), $languages, t('List of abbreviations (iso2 codes) for languages you speak, comma separated. For example "de,it".') ),
-           '$minconfidence' => array('langfilter_minconfidence', t('Minimum confidence in language detection'), $minconfidence, t('Minimum confidence in language detection being correct, from 0 to 100. Posts will not be filtered when the confidence of language detection is below this percent value.') ),
-           '$minlength' => array('langfilter_minlength', t('Minimum length of message body'), $minlength, t('Minimum length of message body for language filter to be used. Posts shorter than this number of characters will not be filtered.') ),
-           '$submit' => t('Save Settings'),
-       ));
+       $t = get_markup_template("settings.tpl", "addon/langfilter/");
+       $s .= replace_macros($t, [
+               '$title'         => L10n::t("Language Filter"),
+               '$intro'         => L10n::t('This addon tries to identify the language of a postings. If it does not match any language spoken by you (see below) the posting will be collapsed. Remember detecting the language is not perfect, especially with short postings.'),
+               '$enabled'       => ['langfilter_enable', L10n::t('Use the language filter'), $enable_checked, ''],
+               '$languages'     => ['langfilter_languages', L10n::t('I speak'), $languages, L10n::t('List of abbreviations (iso2 codes) for languages you speak, comma separated. For example "de,it".')],
+               '$minconfidence' => ['langfilter_minconfidence', L10n::t('Minimum confidence in language detection'), $minconfidence, L10n::t('Minimum confidence in language detection being correct, from 0 to 100. Posts will not be filtered when the confidence of language detection is below this percent value.')],
+               '$minlength'     => ['langfilter_minlength', L10n::t('Minimum length of message body'), $minlength, L10n::t('Minimum length of message body for language filter to be used. Posts shorter than this number of characters will not be filtered.')],
+               '$submit'        => L10n::t('Save Settings'),
+       ]);
 
        return;
 }
@@ -62,23 +69,30 @@ function langfilter_addon_settings_post(&$a,&$b) {
        if(! local_user())
                return;
 
-       if($_POST['langfilter-settings-submit']) {
-               set_pconfig(local_user(),'langfilter','languages',trim($_POST['langfilter_languages']));
-               $enable = ((x($_POST,'langfilter_enable')) ? intval($_POST['langfilter_enable']) : 0);
-               $disable = 1-$enable;
-               set_pconfig(local_user(),'langfilter','disable', $disable);
-               $minconfidence = 0+$_POST['langfilter_minconfidence'];
-               if ( ! $minconfidence ) $minconfidence = 0;
-               else if ( $minconfidence < 0 ) $minconfidence = 0;
-               else if ( $minconfidence > 100 ) $minconfidence = 100;
-               set_pconfig(local_user(),'langfilter','minconfidence', $minconfidence/100.0);
-
-               $minlength = 0+$_POST['langfilter_minlength'];
-               if ( ! $minlength ) $minlength = 32;
-               else if ( $minlength < 0 ) $minlength = 32;
-               set_pconfig(local_user(),'langfilter','minlength', $minlength);
-
-               info( t('Language Filter Settings saved.') . EOL);
+       if ($_POST['langfilter-settings-submit']) {
+               PConfig::set(local_user(), 'langfilter', 'languages', trim($_POST['langfilter_languages']));
+               $enable = ((x($_POST, 'langfilter_enable')) ? intval($_POST['langfilter_enable']) : 0);
+               $disable = 1 - $enable;
+               PConfig::set(local_user(), 'langfilter', 'disable', $disable);
+               $minconfidence = 0 + $_POST['langfilter_minconfidence'];
+               if (!$minconfidence) {
+                       $minconfidence = 0;
+               } elseif ($minconfidence < 0) {
+                       $minconfidence = 0;
+               } elseif ($minconfidence > 100) {
+                       $minconfidence = 100;
+               }
+               PConfig::set(local_user(), 'langfilter', 'minconfidence', $minconfidence / 100.0);
+
+               $minlength = 0 + $_POST['langfilter_minlength'];
+               if (!$minlength) {
+                       $minlength = 32;
+               } elseif ($minlengt8h < 0) {
+                       $minlength = 32;
+               }
+               PConfig::set(local_user(), 'langfilter', 'minlength', $minlength);
+
+               info(L10n::t('Language Filter Settings saved.') . EOL);
        }
 }
 /* Actually filter postings by their language
@@ -131,9 +145,9 @@ function langfilter_prepare_body(&$a,&$b) {
     if ( ! $iso2 ) return;
     $spoken = in_array($iso2, $spoken_languages);
 
-    if( ! $spoken ) {
-        $rnd = random_string(8);
-        $b['html'] = '<div id="langfilter-wrap-' . $rnd . '" class="fakelink" onclick=openClose(\'langfilter-' . $rnd . '\'); >' . sprintf( t('unspoken language %s - Click to open/close'),$lang ) . '</div><div id="langfilter-' . $rnd . '" style="display: none; " >' . $b['html'] . '</div>';
-    }
+       if (!$spoken) {
+               $rnd = random_string(8);
+               $b['html'] = '<div id="langfilter-wrap-' . $rnd . '" class="fakelink" onclick=openClose(\'langfilter-' . $rnd . '\'); >' . L10n::t('unspoken language %s - Click to open/close', $lang) . '</div><div id="langfilter-' . $rnd . '" style="display: none; " >' . $b['html'] . '</div>';
+       }
 }
 ?>
index 60273c3b824d29398e10471f4e403d923368ee2f..4a882a212df686e480581e48b57f9634de566085 100644 (file)
  *
  * ...etc.
  */
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Model\User;
 
-require_once('include/user.php');
-
-
-function ldapauth_install() {
-       register_hook('authenticate', 'addon/ldapauth/ldapauth.php', 'ldapauth_hook_authenticate');
+function ldapauth_install()
+{
+       Addon::registerHook('authenticate', 'addon/ldapauth/ldapauth.php', 'ldapauth_hook_authenticate');
 }
 
-
-function ldapauth_uninstall() {
-       unregister_hook('authenticate', 'addon/ldapauth/ldapauth.php', 'ldapauth_hook_authenticate');
+function ldapauth_uninstall()
+{
+       Addon::unregisterHook('authenticate', 'addon/ldapauth/ldapauth.php', 'ldapauth_hook_authenticate');
 }
 
 
index c58c707f0275647b29f426dcbcf03f4fda670bb5..0c3136a4c326d7a1a0da084594b7233637951a49 100644 (file)
@@ -5,18 +5,21 @@
  * Version: 0.1
  * Author: Michael Vogel <https://pirati.ca/profile/heluecht>
  */
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Util\Network;
 
 function leistungsschutzrecht_install() {
-       register_hook('cron', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_cron');
-       register_hook('getsiteinfo', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_getsiteinfo');
-       register_hook('page_info_data', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_getsiteinfo');
+       Addon::registerHook('cron', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_cron');
+       Addon::registerHook('getsiteinfo', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_getsiteinfo');
+       Addon::registerHook('page_info_data', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_getsiteinfo');
 }
 
 
 function leistungsschutzrecht_uninstall() {
-       unregister_hook('cron', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_cron');
-       unregister_hook('getsiteinfo', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_getsiteinfo');
-       unregister_hook('page_info_data', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_getsiteinfo');
+       Addon::unregisterHook('cron', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_cron');
+       Addon::unregisterHook('getsiteinfo', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_getsiteinfo');
+       Addon::unregisterHook('page_info_data', 'addon/leistungsschutzrecht/leistungsschutzrecht.php', 'leistungsschutzrecht_getsiteinfo');
 }
 
 function leistungsschutzrecht_getsiteinfo($a, &$siteinfo) {
@@ -63,18 +66,17 @@ function leistungsschutzrecht_cuttext($text) {
        return $text;
 }
 
-function leistungsschutzrecht_fetchsites() {
-       require_once("include/network.php");
-
+function leistungsschutzrecht_fetchsites()
+{
        // This list works - but question is how current it is
        $url = "http://leistungsschutzrecht-stoppen.d-64.org/blacklist.txt";
-       $sitelist = fetch_url($url);
+       $sitelist = Network::fetchUrl($url);
        $siteurls = explode(',', $sitelist);
 
        $whitelist = array('tagesschau.de', 'heute.de', 'wdr.de');
 
-       $sites = array();
-       foreach ($siteurls AS $site) {
+       $sites = [];
+       foreach ($siteurls as $site) {
                if (!in_array($site, $whitelist)) {
                        $sites[$site] = $site;
                }
@@ -87,7 +89,7 @@ function leistungsschutzrecht_fetchsites() {
 
        $url = "http://www.vg-media.de/lizenzen/digitale-verlegerische-angebote/wahrnehmungsberechtigte-digitale-verlegerische-angebote.html";
 
-       $site = fetch_url($url);
+       $site = Network::fetchUrl($url);
 
        $doc = new DOMDocument();
        @$doc->loadHTML($site);
index fa31c8823d30791650d4ab8a144b13c2a0449f64..ec61f84758a28bc56c8c5206734a085e63f9b610 100644 (file)
@@ -26,7 +26,7 @@ msgid "libertree Post Settings"
 msgstr ""
 
 #: libertree.php:69
-msgid "Enable Libertree Post Plugin"
+msgid "Enable Libertree Post Addon"
 msgstr ""
 
 #: libertree.php:74
index 28c6b31a08ca3aa1976609da026f53eba9946be0..02c7d22c331bd36c32dabe0782f8ebf03e5114f4 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to libertree"] = "Enviament a libertree";\r
 $a->strings["libertree Post Settings"] = "Ajustos d'enviaments a libertree";\r
-$a->strings["Enable Libertree Post Plugin"] = "Activa el plugin d'enviaments a libertree";\r
+$a->strings["Enable Libertree Post Addon"] = "Activa el addon d'enviaments a libertree";\r
 $a->strings["Libertree API token"] = "Libertree API token";\r
 $a->strings["Libertree site URL"] = "lloc URL libertree";\r
 $a->strings["Post to Libertree by default"] = "Enviar a libertree per defecte";\r
index d9473ab0b5eecc5dca61dc36ff79454318f14c12..b97b17ede9edf233dcc7e426ddf79a850524b3dd 100644 (file)
@@ -28,7 +28,7 @@ msgid "libertree Post Settings"
 msgstr "libertree nastavení příspěvků"
 
 #: libertree.php:69
-msgid "Enable Libertree Post Plugin"
+msgid "Enable Libertree Post Addon"
 msgstr "Povolit Libertree Post rozšíření"
 
 #: libertree.php:74
index 97618321a4b203d939104d9a4b1af4e5bc3c367b..57ad0ff13cecf4e2d7e71296f6a12ac53b362a20 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_cs($n){
 ;
 $a->strings["Post to libertree"] = "Poslat na libertree";
 $a->strings["libertree Post Settings"] = "libertree nastavení příspěvků";
-$a->strings["Enable Libertree Post Plugin"] = "Povolit Libertree Post rozšíření";
+$a->strings["Enable Libertree Post Addon"] = "Povolit Libertree Post rozšíření";
 $a->strings["Libertree API token"] = "Libertree API token";
 $a->strings["Libertree site URL"] = "URL adresa Libertree ";
 $a->strings["Post to Libertree by default"] = "Defaultně poslat na Libertree";
index 7c3d3f1a305d3f91c9b450261f7684be6ad7eacf..970d22ddba8c1399448d016db458c6e56881a628 100644 (file)
@@ -29,8 +29,8 @@ msgid "libertree Post Settings"
 msgstr "libertree Post Einstellungen"
 
 #: libertree.php:69
-msgid "Enable Libertree Post Plugin"
-msgstr "Libertree Post Plugin aktivieren"
+msgid "Enable Libertree Post Addon"
+msgstr "Libertree Post Addon aktivieren"
 
 #: libertree.php:74
 msgid "Libertree API token"
index 27d40815caa06cc700fd00667ab8793ebf609cfd..c6867705c0095984b2c768fa2882e5425a9df880 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_de($n){
 ;
 $a->strings["Post to libertree"] = "bei libertree veröffentlichen";
 $a->strings["libertree Post Settings"] = "libertree Post Einstellungen";
-$a->strings["Enable Libertree Post Plugin"] = "Libertree Post Plugin aktivieren";
+$a->strings["Enable Libertree Post Addon"] = "Libertree Post Addon aktivieren";
 $a->strings["Libertree API token"] = "Libertree API Token";
 $a->strings["Libertree site URL"] = "Libertree URL";
 $a->strings["Post to Libertree by default"] = "Standardmäßig bei libertree veröffentlichen";
index 11b8496cd7536a8008495760d4afa778c927d543..674972d0e714afa67450e6e79ba1a903075bb192 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to libertree"] = "Afiŝi al libertree";\r
 $a->strings["libertree Post Settings"] = "Agordoj por Afiŝoj ĉe libertree";\r
-$a->strings["Enable Libertree Post Plugin"] = "Aktivigi Kromprogramon por Afiŝoj ĉe libertree";\r
+$a->strings["Enable Libertree Post Addon"] = "Aktivigi Kromprogramon por Afiŝoj ĉe libertree";\r
 $a->strings["Libertree API token"] = "Libertree API ĵetono";\r
 $a->strings["Libertree site URL"] = "URL adreso de libertree retejo:";\r
 $a->strings["Post to Libertree by default"] = "Defaŭlte afiŝi ĉe Libertree";\r
index 8fcc8a8d0cc0e40657f288b8cb79022ab3030e36..d600576588b7cad8b3e4111b191b9fe51c6310b0 100644 (file)
@@ -28,8 +28,8 @@ msgid "libertree Post Settings"
 msgstr "Ajustes de Publicación de Libertree"
 
 #: libertree.php:69
-msgid "Enable Libertree Post Plugin"
-msgstr "Habilitar Plugin de publicación de Libertree"
+msgid "Enable Libertree Post Addon"
+msgstr "Habilitar Addon de publicación de Libertree"
 
 #: libertree.php:74
 msgid "Libertree API token"
index 0be7bbca74f540656f59b768668b89eda0cd6d6c..8a8dbf1f93c5b172fa007a3c0ca685a009e1a953 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_es($n){
 ;
 $a->strings["Post to libertree"] = "Publicar en Libertree";
 $a->strings["libertree Post Settings"] = "Ajustes de Publicación de Libertree";
-$a->strings["Enable Libertree Post Plugin"] = "Habilitar Plugin de publicación de Libertree";
+$a->strings["Enable Libertree Post Addon"] = "Habilitar Addon de publicación de Libertree";
 $a->strings["Libertree API token"] = "Símbolo de API de Libertree";
 $a->strings["Libertree site URL"] = "URL de la página de Libertree";
 $a->strings["Post to Libertree by default"] = "Publicar en Libertree por defecto";
index ce956cf1a5ef294054beb388ca1f77ba224915f8..6deb7b4e83b95d49cd32c2fc01f6672cca8b4875 100644 (file)
@@ -28,8 +28,8 @@ msgid "libertree Post Settings"
 msgstr "Réglages des messages sur libertree"
 
 #: libertree.php:69
-msgid "Enable Libertree Post Plugin"
-msgstr "Activer le plugin de publication sur libertree"
+msgid "Enable Libertree Post Addon"
+msgstr "Activer leaddonde publication sur libertree"
 
 #: libertree.php:74
 msgid "Libertree API token"
index 8f7770164bd244602f394c854f20e4b20c0bd9d6..1e2279143b08930428358016de9271d9cd9824db 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_fr($n){
 ;
 $a->strings["Post to libertree"] = "Publier sur libertree";
 $a->strings["libertree Post Settings"] = "Réglages des messages sur libertree";
-$a->strings["Enable Libertree Post Plugin"] = "Activer le plugin de publication sur libertree";
+$a->strings["Enable Libertree Post Addon"] = "Activer le addon de publication sur libertree";
 $a->strings["Libertree API token"] = "Clé de l'API libertree";
 $a->strings["Libertree site URL"] = "URL du site libertree";
 $a->strings["Post to Libertree by default"] = "Publier sur libertree par défaut";
index 7d5e7f37b8bbe1108333a1795bb9a79ec9913730..6256e21c0a8ad6c0f02e0b139c4c88ed62074619 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to libertree"] = "";\r
 $a->strings["libertree Post Settings"] = "";\r
-$a->strings["Enable Libertree Post Plugin"] = "";\r
+$a->strings["Enable Libertree Post Addon"] = "";\r
 $a->strings["Libertree API token"] = "";\r
 $a->strings["Libertree site URL"] = "";\r
 $a->strings["Post to Libertree by default"] = "";\r
index 25bd37ff6ea0ebc6030e5dc88005e2c0eb3bf446..a13219a6c866b45b4e7439c2abfaa2c1e5b284b7 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:18+0000\n"
+"PO-Revision-Date: 2018-03-19 13:22+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -28,8 +28,8 @@ msgid "libertree Post Settings"
 msgstr "Impostazioni di invio a Libertree"
 
 #: libertree.php:69
-msgid "Enable Libertree Post Plugin"
-msgstr "Abilita il plugin di invio a Libertree"
+msgid "Enable Libertree Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio a Libertree"
 
 #: libertree.php:74
 msgid "Libertree API token"
index beef73dae02637b032bf511f3cd40e98f144ea21..91984f9d5b2ad2abb9860c7e397f1809593667fa 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_it($n){
 ;
 $a->strings["Post to libertree"] = "Invia a Libertree";
 $a->strings["libertree Post Settings"] = "Impostazioni di invio a Libertree";
-$a->strings["Enable Libertree Post Plugin"] = "Abilita il plugin di invio a Libertree";
+$a->strings["Enable Libertree Post Addon"] = "Abilita il componente aggiuntivo di invio a Libertree";
 $a->strings["Libertree API token"] = "Token API Libertree";
 $a->strings["Libertree site URL"] = "Indirizzo sito Libertree";
 $a->strings["Post to Libertree by default"] = "Invia sempre a Libertree";
index 679aefe1860ba415fd91c12abc8c398330b8d8e8..1600c269d3f9463aea6432c6b83405688e2cb421 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to libertree"] = "";\r
 $a->strings["libertree Post Settings"] = "";\r
-$a->strings["Enable Libertree Post Plugin"] = "";\r
+$a->strings["Enable Libertree Post Addon"] = "";\r
 $a->strings["Libertree API token"] = "";\r
 $a->strings["Libertree site URL"] = "";\r
 $a->strings["Post to Libertree by default"] = "";\r
index 217757f2bc1543c05bfa8ada1e45e5c1a452856c..5f21224863cbd6d8efa7226e6178d64e18c50fdb 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to libertree"] = "";\r
 $a->strings["libertree Post Settings"] = "";\r
-$a->strings["Enable Libertree Post Plugin"] = "";\r
+$a->strings["Enable Libertree Post Addon"] = "";\r
 $a->strings["Libertree API token"] = "";\r
 $a->strings["Libertree site URL"] = "";\r
 $a->strings["Post to Libertree by default"] = "";\r
index 4df816bb0cc7aabc0893a74a2f96aa0aa3b490c1..d6554ff62ba77132cc13e49f3e938749ef66765c 100644 (file)
@@ -28,7 +28,7 @@ msgid "libertree Post Settings"
 msgstr "Configurações de publicação do Libertree"
 
 #: libertree.php:69
-msgid "Enable Libertree Post Plugin"
+msgid "Enable Libertree Post Addon"
 msgstr "Habilitar plug-in para publicar no Libertree"
 
 #: libertree.php:74
index 9c75069803a6ade57f45096a364aaedd804e1e32..d55aee610170bfe51ebe9b465e5641389337afdc 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_pt_br($n){
 ;
 $a->strings["Post to libertree"] = "Publicar no Libertree";
 $a->strings["libertree Post Settings"] = "Configurações de publicação do Libertree";
-$a->strings["Enable Libertree Post Plugin"] = "Habilitar plug-in para publicar no Libertree";
+$a->strings["Enable Libertree Post Addon"] = "Habilitar plug-in para publicar no Libertree";
 $a->strings["Libertree API token"] = "";
 $a->strings["Libertree site URL"] = "";
 $a->strings["Post to Libertree by default"] = "Publicar no Libertree por padrão";
index 4690e7c15bc0446ecea848581e32fb6e8eea76ed..bd99286a6394620e2569377c2438172b83dbeb59 100644 (file)
@@ -28,7 +28,7 @@ msgid "libertree Post Settings"
 msgstr "Configurări Postări libertree "
 
 #: libertree.php:69
-msgid "Enable Libertree Post Plugin"
+msgid "Enable Libertree Post Addon"
 msgstr "Activare Modul Postare Libertree"
 
 #: libertree.php:74
index 3136a26b0e59e8dd235c0031e9642e54c4c5fdb3..efa612ed5445449eb3d7d5cb53303ad2f3a227b1 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_ro($n){
 ;
 $a->strings["Post to libertree"] = "Postați pe libertree";
 $a->strings["libertree Post Settings"] = "Configurări Postări libertree ";
-$a->strings["Enable Libertree Post Plugin"] = "Activare Modul Postare Libertree";
+$a->strings["Enable Libertree Post Addon"] = "Activare Modul Postare Libertree";
 $a->strings["Libertree API token"] = "Token API Libertree";
 $a->strings["Libertree site URL"] = "URL site Libertree";
 $a->strings["Post to Libertree by default"] = "Postați implicit pe Libertree";
index c6101b705f99cca1e9d0b28e239e858f03da51ea..9d1522a4ab6c1fb9f86b344c7a6439889b8d4260 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to libertree"] = "";\r
 $a->strings["libertree Post Settings"] = "";\r
-$a->strings["Enable Libertree Post Plugin"] = "";\r
+$a->strings["Enable Libertree Post Addon"] = "";\r
 $a->strings["Libertree API token"] = "";\r
 $a->strings["Libertree site URL"] = "";\r
 $a->strings["Post to Libertree by default"] = "";\r
index 2122014c0eaaeb2c57906535a976392270fe2535..c3d1f6a109d42531499bef92cbefbf3410324691 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to libertree"] = "转播到libertree";\r
 $a->strings["libertree Post Settings"] = "libertree转播设置";\r
-$a->strings["Enable Libertree Post Plugin"] = "使Libertree转播插件可用";\r
+$a->strings["Enable Libertree Post Addon"] = "使Libertree转播插件可用";\r
 $a->strings["Libertree API token"] = "Libertree API令牌";\r
 $a->strings["Libertree site URL"] = "Libertree网站URL";\r
 $a->strings["Post to Libertree by default"] = "默认地转播到Libertree";\r
index c87a71043799d05626a705c77c27d74d6ae0c182..9ecabc2fb001ef75eb297d1ffed43205f7cc4579 100644 (file)
@@ -1,26 +1,29 @@
 <?php
-
 /**
  * Name: Libertree Post Connector
  * Description: Post to libertree accounts
  * Version: 1.0
  * Author: Tony Baldwin <https://free-haven.org/u/tony>
  */
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\Network;
 
 function libertree_install() {
-    register_hook('post_local',           'addon/libertree/libertree.php', 'libertree_post_local');
-    register_hook('notifier_normal',      'addon/libertree/libertree.php', 'libertree_send');
-    register_hook('jot_networks',         'addon/libertree/libertree.php', 'libertree_jot_nets');
-    register_hook('connector_settings',      'addon/libertree/libertree.php', 'libertree_settings');
-    register_hook('connector_settings_post', 'addon/libertree/libertree.php', 'libertree_settings_post');
+    Addon::registerHook('post_local',           'addon/libertree/libertree.php', 'libertree_post_local');
+    Addon::registerHook('notifier_normal',      'addon/libertree/libertree.php', 'libertree_send');
+    Addon::registerHook('jot_networks',         'addon/libertree/libertree.php', 'libertree_jot_nets');
+    Addon::registerHook('connector_settings',      'addon/libertree/libertree.php', 'libertree_settings');
+    Addon::registerHook('connector_settings_post', 'addon/libertree/libertree.php', 'libertree_settings_post');
 
 }
 function libertree_uninstall() {
-    unregister_hook('post_local',       'addon/libertree/libertree.php', 'libertree_post_local');
-    unregister_hook('notifier_normal',  'addon/libertree/libertree.php', 'libertree_send');
-    unregister_hook('jot_networks',     'addon/libertree/libertree.php', 'libertree_jot_nets');
-    unregister_hook('connector_settings',      'addon/libertree/libertree.php', 'libertree_settings');
-    unregister_hook('connector_settings_post', 'addon/libertree/libertree.php', 'libertree_settings_post');
+    Addon::unregisterHook('post_local',       'addon/libertree/libertree.php', 'libertree_post_local');
+    Addon::unregisterHook('notifier_normal',  'addon/libertree/libertree.php', 'libertree_send');
+    Addon::unregisterHook('jot_networks',     'addon/libertree/libertree.php', 'libertree_jot_nets');
+    Addon::unregisterHook('connector_settings',      'addon/libertree/libertree.php', 'libertree_settings');
+    Addon::unregisterHook('connector_settings_post', 'addon/libertree/libertree.php', 'libertree_settings_post');
 }
 
 
@@ -33,7 +36,7 @@ function libertree_jot_nets(&$a,&$b) {
         $ltree_defpost = get_pconfig(local_user(),'libertree','post_by_default');
         $selected = ((intval($ltree_defpost) == 1) ? ' checked="checked" ' : '');
         $b .= '<div class="profile-jot-net"><input type="checkbox" name="libertree_enable"' . $selected . ' value="1" /> '
-            . t('Post to libertree') . '</div>';
+            . L10n::t('Post to libertree') . '</div>';
     }
 }
 
@@ -64,36 +67,36 @@ function libertree_settings(&$a,&$s) {
     /* Add some HTML to the existing form */
 
     $s .= '<span id="settings_libertree_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_libertree_expanded\'); openClose(\'settings_libertree_inflated\');">';
-    $s .= '<img class="connector'.$css.'" src="images/libertree.png" /><h3 class="connector">'. t('libertree Export').'</h3>';
+    $s .= '<img class="connector'.$css.'" src="images/libertree.png" /><h3 class="connector">'. L10n::t('libertree Export').'</h3>';
     $s .= '</span>';
     $s .= '<div id="settings_libertree_expanded" class="settings-block" style="display: none;">';
     $s .= '<span class="fakelink" onclick="openClose(\'settings_libertree_expanded\'); openClose(\'settings_libertree_inflated\');">';
-    $s .= '<img class="connector'.$css.'" src="images/libertree.png" /><h3 class="connector">'. t('libertree Export').'</h3>';
+    $s .= '<img class="connector'.$css.'" src="images/libertree.png" /><h3 class="connector">'. L10n::t('libertree Export').'</h3>';
     $s .= '</span>';
 
     $s .= '<div id="libertree-enable-wrapper">';
-    $s .= '<label id="libertree-enable-label" for="libertree-checkbox">' . t('Enable Libertree Post Plugin') . '</label>';
+    $s .= '<label id="libertree-enable-label" for="libertree-checkbox">' . L10n::t('Enable Libertree Post Addon') . '</label>';
     $s .= '<input id="libertree-checkbox" type="checkbox" name="libertree" value="1" ' . $checked . '/>';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="libertree-api_token-wrapper">';
-    $s .= '<label id="libertree-api_token-label" for="libertree-api_token">' . t('Libertree API token') . '</label>';
+    $s .= '<label id="libertree-api_token-label" for="libertree-api_token">' . L10n::t('Libertree API token') . '</label>';
     $s .= '<input id="libertree-api_token" type="text" name="libertree_api_token" value="' . $ltree_api_token . '" />';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="libertree-url-wrapper">';
-    $s .= '<label id="libertree-url-label" for="libertree-url">' . t('Libertree site URL') . '</label>';
+    $s .= '<label id="libertree-url-label" for="libertree-url">' . L10n::t('Libertree site URL') . '</label>';
     $s .= '<input id="libertree-url" type="text" name="libertree_url" value="' . $ltree_url . '" />';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="libertree-bydefault-wrapper">';
-    $s .= '<label id="libertree-bydefault-label" for="libertree-bydefault">' . t('Post to Libertree by default') . '</label>';
+    $s .= '<label id="libertree-bydefault-label" for="libertree-bydefault">' . L10n::t('Post to Libertree by default') . '</label>';
     $s .= '<input id="libertree-bydefault" type="checkbox" name="libertree_bydefault" value="1" ' . $def_checked . '/>';
     $s .= '</div><div class="clear"></div>';
 
     /* provide a submit button */
 
-    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="libertree-submit" name="libertree-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="libertree-submit" name="libertree-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
 }
 
@@ -205,7 +208,7 @@ function libertree_send(&$a,&$b) {
                 } while ($oldbody != $body);
 
                // convert to markdown
-               $body = bb2diaspora($body, false, false);
+               $body = bb2diaspora($body, false);
 
                // Adding the title
                if(strlen($title))
@@ -218,9 +221,7 @@ function libertree_send(&$a,&$b) {
                //      'token' => $ltree_api_token
                );
 
-               $result = post_url($ltree_blog,$params);
+               $result = Network::post($ltree_blog, $params);
                logger('libertree: ' . $result);
-
        }
 }
-
index 16fbd85a24bbb09da743c37215c4084ea64296d8..07ac2a798309b384379e5e234762b6675bc43713 100644 (file)
@@ -1,4 +1,4 @@
-# Libravatar Plugin
+# Libravatar Addon
 by [Klaus Weidenbach](http://friendica.dszdw.net/profile/klaus)
 
 This addon allows you to look up an avatar image for new users and contacts at [Libravatar](http://www.libravatar.com). It will be used if there have not been found any other avatar images yet for example through OpenID.
@@ -6,7 +6,7 @@ This addon allows you to look up an avatar image for new users and contacts at [
 Libravatar is a free and open replacement for Gravatar. It is a service where people can store an avatar image for their email-addresses. These avatar images can get looked up for example in comment functions, profile pages, etc. on other sites. There exists a central installation at [www.libravatar.com](http://www.libravatar.com), but you can also host it on your own server. If no avatar was found Libravatar will look up at Gravatar as a fallback.
 There is no rating available, as it is on Gravatar, so all avatar lookups are g-rated. (Suitable for all audiences.)
 
-PHP >= 5.3 is required for this plugin!
+PHP >= 5.3 is required for this addon!
 
 You can not use the Libravatar and Gravatar addon at the same time. You need to choose one. If you need other ratings than g you better stay with Gravatar, otherwise it is safe to use Libravatar, because it will fall back to Gravatar if nothing was found at Libravatar.
 
index 645a500b6fe3a4a7afa3aa3311c1fbc21a2b9767..6fd10f304ae0687ba370bd7d11b06b0e51248204 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:19+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index d958dba44ab206f32b81bffe7ea76189e9ee3570..133b8a8f1a0cff371a6a549b4fcf39dc48012e8f 100644 (file)
@@ -1,31 +1,35 @@
 <?php
 /**
  * Name: Libravatar Support
- * Description: If there is no avatar image for a new user or contact this plugin will look for one at Libravatar. Please disable Gravatar addon if you use this one. (requires PHP >= 5.3)
+ * Description: If there is no avatar image for a new user or contact this addon will look for one at Libravatar. Please disable Gravatar addon if you use this one. (requires PHP >= 5.3)
  * Version: 1.1
  * Author: Klaus Weidenbach <http://friendica.dszdw.net/profile/klaus>
  */
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
 
 /**
- * Installs the plugin hook
+ * Installs the addon hook
  */
-function libravatar_install() {
+function libravatar_install()
+{
        if (! version_compare(PHP_VERSION, '5.3.0', '>=')) {
-               info(t('Could NOT install Libravatar successfully.<br>It requires PHP >= 5.3') .EOL);
+               info(L10n::t('Could NOT install Libravatar successfully.<br>It requires PHP >= 5.3') .EOL);
                // avoid registering the hook
                return false;
        }
-       register_hook('avatar_lookup', 'addon/libravatar/libravatar.php', 'libravatar_lookup');
 
+       Addon::registerHook('avatar_lookup', 'addon/libravatar/libravatar.php', 'libravatar_lookup');
        logger("registered libravatar in avatar_lookup hook");
 }
 
 /**
- * Removes the plugin hook
+ * Removes the addon hook
  */
-function libravatar_uninstall() {
-       unregister_hook('avatar_lookup', 'addon/libravatar/libravatar.php', 'libravatar_lookup');
-
+function libravatar_uninstall()
+{
+       Addon::unregisterHook('avatar_lookup', 'addon/libravatar/libravatar.php', 'libravatar_lookup');
        logger("unregistered libravatar in avatar_lookup hook");
 }
 
@@ -35,15 +39,17 @@ function libravatar_uninstall() {
  * @param $a array
  * @param &$b array
  */
-function libravatar_lookup($a, &$b) {
-       $default_avatar = get_config('libravatar', 'default_img');
+function libravatar_lookup($a, &$b)
+{
+       $default_avatar = Config::get('libravatar', 'default_img');
 
        if (! $default_avatar) {
                // if not set, look up if there was one from the gravatar addon
                $default_avatar = get_config('gravatar', 'default_img');
                // setting default avatar if nothing configured
-               if (! $default_avatar)
+               if (!$default_avatar) {
                        $default_avatar = 'identicon'; // default image will be a random pattern
+               }
        }
 
        require_once 'Services/Libravatar.php';
@@ -59,29 +65,31 @@ function libravatar_lookup($a, &$b) {
 /**
  * Display admin settings for this addon
  */
-function libravatar_plugin_admin (&$a, &$o) {
-       $t = get_markup_template( "admin.tpl", "addon/libravatar" );
+function libravatar_addon_admin(&$a, &$o)
+{
+       $t = get_markup_template("admin.tpl", "addon/libravatar");
 
        $default_avatar = get_config('libravatar', 'default_img');
 
        // set default values for first configuration
-       if(! $default_avatar)
+       if (!$default_avatar) {
                $default_avatar = 'identicon'; // pseudo-random geometric pattern based on email hash
+       }
 
        // Available options for the select boxes
-       $default_avatars = array(
-               'mm' => t('generic profile image'),
-               'identicon' => t('random geometric pattern'),
-               'monsterid' => t('monster face'),
-               'wavatar' => t('computer generated face'),
-               'retro' => t('retro arcade style face'),
-       );
+       $default_avatars = [
+               'mm' => L10n::t('generic profile image'),
+               'identicon' => L10n::t('random geometric pattern'),
+               'monsterid' => L10n::t('monster face'),
+               'wavatar' => L10n::t('computer generated face'),
+               'retro' => L10n::t('retro arcade style face'),
+       ];
 
        // Show warning if PHP version is too old
        if (! version_compare(PHP_VERSION, '5.3.0', '>=')) {
-               $o = '<h5>' .t('Warning') .'</h5><p>';
-               $o .= sprintf(t('Your PHP version %s is lower than the required PHP >= 5.3.'), PHP_VERSION);
-               $o .= '<br>' .t('This addon is not functional on your server.') .'<p><br>';
+               $o = '<h5>' .L10n::t('Warning') .'</h5><p>';
+               $o .= L10n::t('Your PHP version %s is lower than the required PHP >= 5.3.', PHP_VERSION);
+               $o .= '<br>' .L10n::t('This addon is not functional on your server.') .'<p><br>';
                return;
        }
 
@@ -90,25 +98,25 @@ function libravatar_plugin_admin (&$a, &$o) {
                dbesc('gravatar')
        );
        if (count($r)) {
-               $o = '<h5>' .t('Information') .'</h5><p>' .t('Gravatar addon is installed. Please disable the Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar.') .'</p><br><br>';
+               $o = '<h5>' .L10n::t('Information') .'</h5><p>' .L10n::t('Gravatar addon is installed. Please disable the Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar.') .'</p><br><br>';
        }
 
        // output Libravatar settings
        $o .= '<input type="hidden" name="form_security_token" value="' .get_form_security_token("libravatarsave") .'">';
-       $o .= replace_macros( $t, array(
-               '$submit' => t('Save Settings'),
-               '$default_avatar' => array('avatar', t('Default avatar image'), $default_avatar, t('Select default avatar image if none was found. See README'), $default_avatars),
-       ));
+       $o .= replace_macros( $t, [
+               '$submit' => L10n::t('Save Settings'),
+               '$default_avatar' => ['avatar', L10n::t('Default avatar image'), $default_avatar, L10n::t('Select default avatar image if none was found. See README'), $default_avatars],
+       ]);
 }
 
 /**
  * Save admin settings
  */
-function libravatar_plugin_admin_post (&$a) {
+function libravatar_addon_admin_post(&$a)
+{
        check_form_security_token('libravatarrsave');
 
        $default_avatar = ((x($_POST, 'avatar')) ? notags(trim($_POST['avatar'])) : 'identicon');
-       set_config('libravatar', 'default_img', $default_avatar);
-       info(t('Libravatar settings updated.') .EOL);
+       Config::set('libravatar', 'default_img', $default_avatar);
+       info(L10n::t('Libravatar settings updated.') .EOL);
 }
-?>
index 6c506e053f112765e030fa4f0797f31065060b29..9baae18ebe175286931a8905e6160c8303a78c11 100644 (file)
@@ -26,7 +26,7 @@ msgid "LiveJournal Post Settings"
 msgstr ""
 
 #: ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
+msgid "Enable LiveJournal Post Addon"
 msgstr ""
 
 #: ljpost.php:77
index 04053fa20fee9f9e399d8a49b68c54cf12650aa5..ec370df8e7cc499728bbe263473dc4801a0ea728 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to LiveJournal"] = "Missatge a Livejournal";\r
 $a->strings["LiveJournal Post Settings"] = "Configuració d'enviaments a Livejournal";\r
-$a->strings["Enable LiveJournal Post Plugin"] = "Habilitat el plugin d'enviaments a Livejournal";\r
+$a->strings["Enable LiveJournal Post Addon"] = "Habilitat el addon d'enviaments a Livejournal";\r
 $a->strings["LiveJournal username"] = "Nom d'usuari a Livejournal";\r
 $a->strings["LiveJournal password"] = "Contrasenya a Livejournal";\r
 $a->strings["Post to LiveJournal by default"] = "Enviar per defecte a Livejournal";\r
index 78abd5272d8b75d01fa4834e90349d5a6b230331..74a88433a5d5c0cc84e7f89da86e8509b567f0e1 100644 (file)
@@ -28,8 +28,8 @@ msgid "LiveJournal Post Settings"
 msgstr "Nastavení LiveJournal Post"
 
 #: ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
-msgstr "Povolit LiveJournal Post plugin"
+msgid "Enable LiveJournal Post Addon"
+msgstr "Povolit LiveJournal Post addon"
 
 #: ljpost.php:77
 msgid "LiveJournal username"
index f1dad443a0d6e9d42235904daf6273e5b83bf822..d2c833d975f833e616dbe6921070701999a0b8f1 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_cs($n){
 ;
 $a->strings["Post to LiveJournal"] = "Poslat na LiveJournal";
 $a->strings["LiveJournal Post Settings"] = "Nastavení LiveJournal Post";
-$a->strings["Enable LiveJournal Post Plugin"] = "Povolit LiveJournal Post plugin";
+$a->strings["Enable LiveJournal Post Addon"] = "Povolit LiveJournal Post addon";
 $a->strings["LiveJournal username"] = "LiveJournal uživatelské jméno";
 $a->strings["LiveJournal password"] = "LiveJournal heslo";
 $a->strings["Post to LiveJournal by default"] = "Defaultně umístit na LiveJournal";
index 62cd8afc92ec8440da2eca4f03dd8c6b4e1d5533..4d915c0d37b3bd95fba072314b86545f6a229ee0 100644 (file)
@@ -29,8 +29,8 @@ msgid "LiveJournal Post Settings"
 msgstr "LiveJournal Veröffentlichungs-Einstellungen"
 
 #: ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
-msgstr "LiveJournal Post Plugin aktivieren"
+msgid "Enable LiveJournal Post Addon"
+msgstr "LiveJournal Post Addon aktivieren"
 
 #: ljpost.php:77
 msgid "LiveJournal username"
index 862b57798edf73bdb25fcc136939828f542eef8b..e6b9c84819465cb5063d4581cf54a1d5e34f4c2f 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_de($n){
 ;
 $a->strings["Post to LiveJournal"] = "In LiveJournal veröffentlichen.";
 $a->strings["LiveJournal Post Settings"] = "LiveJournal Veröffentlichungs-Einstellungen";
-$a->strings["Enable LiveJournal Post Plugin"] = "LiveJournal Post Plugin aktivieren";
+$a->strings["Enable LiveJournal Post Addon"] = "LiveJournal Post Addon aktivieren";
 $a->strings["LiveJournal username"] = "LiveJournal Benutzername";
 $a->strings["LiveJournal password"] = "LiveJournal Passwort";
 $a->strings["Post to LiveJournal by default"] = "Standardmäßig bei LiveJournal veröffentlichen";
index b606e6a661c4f4f917641c8e0a4f19cdc4431bca..1bd09a6f9c4eeb9f6fc90cd26b21c639f1f500e4 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to LiveJournal"] = "Afiŝi ĉe LiveJournal";\r
 $a->strings["LiveJournal Post Settings"] = "Agordoj pri afiŝoj ĉe LiveJournal";\r
-$a->strings["Enable LiveJournal Post Plugin"] = "Ŝalti la LiveJournal-afiŝo kromprogramon.";\r
+$a->strings["Enable LiveJournal Post Addon"] = "Ŝalti la LiveJournal-afiŝo kromprogramon.";\r
 $a->strings["LiveJournal username"] = "LiveJournal Salutnomo";\r
 $a->strings["LiveJournal password"] = "LiveJournal pasvorto";\r
 $a->strings["Post to LiveJournal by default"] = "Defaŭlte afiŝi al LiveJournal";\r
index 16efa134f7ed0667dbeb60cdf8dd3637a090d83e..f94e20bbd0755eabfa0e90fda842f94eb1def4e1 100644 (file)
@@ -28,8 +28,8 @@ msgid "LiveJournal Post Settings"
 msgstr "Ajustes de publicación de LiveJournal"
 
 #: ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
-msgstr "Habilitar Plugin de publicción de LiveJournal"
+msgid "Enable LiveJournal Post Addon"
+msgstr "Habilitar Addon de publicción de LiveJournal"
 
 #: ljpost.php:77
 msgid "LiveJournal username"
index 89e117fbcf564063b750ef23d24b6c798cffc178..10092765f923ab5ac9f5896f2514a6af3c6ff8f2 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_es($n){
 ;
 $a->strings["Post to LiveJournal"] = "Publicar en LiveJournal";
 $a->strings["LiveJournal Post Settings"] = "Ajustes de publicación de LiveJournal";
-$a->strings["Enable LiveJournal Post Plugin"] = "Habilitar Plugin de publicción de LiveJournal";
+$a->strings["Enable LiveJournal Post Addon"] = "Habilitar Addon de publicción de LiveJournal";
 $a->strings["LiveJournal username"] = "Nombre de usuario de LiveJournal";
 $a->strings["LiveJournal password"] = "Contraseña de LiveJournal";
 $a->strings["Post to LiveJournal by default"] = "Publicar en LiveJournal por defecto";
index 615f929a4e4b391eaf457bb8f163462434ec8abf..85407d5717c8ddfe253e41ddd55e2edcd3ef1b47 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to LiveJournal"] = "Poster vers LiveJournal";\r
 $a->strings["LiveJournal Post Settings"] = "Réglages LiveJournal";\r
-$a->strings["Enable LiveJournal Post Plugin"] = "Activer \"Poster vers LiveJournal\"";\r
+$a->strings["Enable LiveJournal Post Addon"] = "Activer \"Poster vers LiveJournal\"";\r
 $a->strings["LiveJournal username"] = "Nom d'utilisateur LiveJournal";\r
 $a->strings["LiveJournal password"] = "Mot de passe";\r
 $a->strings["Post to LiveJournal by default"] = "Poster vers LiveJournal par défaut";\r
index 5edfc631c5e9d07def6ef2da54db8df184634716..164dc4413dbf5ba0adc24445dc1cbe0e562ac2e4 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to LiveJournal"] = "";\r
 $a->strings["LiveJournal Post Settings"] = "";\r
-$a->strings["Enable LiveJournal Post Plugin"] = "";\r
+$a->strings["Enable LiveJournal Post Addon"] = "";\r
 $a->strings["LiveJournal username"] = "";\r
 $a->strings["LiveJournal password"] = "";\r
 $a->strings["Post to LiveJournal by default"] = "";\r
index 23b345bb9d517e8b22b209f5753530364bcfc072..b7e70700ff1e5ebc7e25d1553c6c4f807f741e5c 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:19+0000\n"
+"PO-Revision-Date: 2018-03-19 13:23+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -28,8 +28,8 @@ msgid "LiveJournal Post Settings"
 msgstr "Impostazioni invio a LiveJournal"
 
 #: ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
-msgstr "Abilita il plugin di invio a LiveJournal"
+msgid "Enable LiveJournal Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio a LiveJournal"
 
 #: ljpost.php:77
 msgid "LiveJournal username"
index 538b0ef88393793aa7feddc73ac7afb16e32262f..54f5fac5818f74b4711b0166b67bffa807fba2ba 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_it($n){
 ;
 $a->strings["Post to LiveJournal"] = "Invia a LiveJournal";
 $a->strings["LiveJournal Post Settings"] = "Impostazioni invio a LiveJournal";
-$a->strings["Enable LiveJournal Post Plugin"] = "Abilita il plugin di invio a LiveJournal";
+$a->strings["Enable LiveJournal Post Addon"] = "Abilita il componente aggiuntivo di invio a LiveJournal";
 $a->strings["LiveJournal username"] = "Nome utente LiveJournal";
 $a->strings["LiveJournal password"] = "Password LiveJournal";
 $a->strings["Post to LiveJournal by default"] = "Invia sempre a LiveJournal";
index c4e0456251ee01f9c512726f764011e54cf1fc57..0ea53bd39c6be2628c1267e8226802c722b6b2d8 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to LiveJournal"] = "";\r
 $a->strings["LiveJournal Post Settings"] = "";\r
-$a->strings["Enable LiveJournal Post Plugin"] = "";\r
+$a->strings["Enable LiveJournal Post Addon"] = "";\r
 $a->strings["LiveJournal username"] = "";\r
 $a->strings["LiveJournal password"] = "";\r
 $a->strings["Post to LiveJournal by default"] = "";\r
index 3497dc2ca9973fea355e8b5fabc41d9f92981428..a96826eea61185052f0e475ae6b637b6124861f8 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to LiveJournal"] = "Post do LiveJournal";\r
 $a->strings["LiveJournal Post Settings"] = "Ustawienia postów do LiveJournal";\r
-$a->strings["Enable LiveJournal Post Plugin"] = "";\r
+$a->strings["Enable LiveJournal Post Addon"] = "";\r
 $a->strings["LiveJournal username"] = "Nazwa użytkownika do LiveJournal";\r
 $a->strings["LiveJournal password"] = "Hasło do LiveJournal";\r
 $a->strings["Post to LiveJournal by default"] = "automatycznie publikuj na LiveJournal";\r
index 3ed7117f3348d5c6fe1df7c63ed1f1eb859df52f..832a647de36a2bf19d112edd619419c256b5424f 100644 (file)
@@ -28,7 +28,7 @@ msgid "LiveJournal Post Settings"
 msgstr "Configurações de publicação no LiveJournal"
 
 #: ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
+msgid "Enable LiveJournal Post Addon"
 msgstr "Habilitar plug-in para publicar no LiveJournal"
 
 #: ljpost.php:77
index 0792861bea9f8e4c1f07fc43fb75daf4d9df2f31..ddc091a40686d9a59d3d3db0c494d8dc00b7395f 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_pt_br($n){
 ;
 $a->strings["Post to LiveJournal"] = "Publicar no LiveJournal";
 $a->strings["LiveJournal Post Settings"] = "Configurações de publicação no LiveJournal";
-$a->strings["Enable LiveJournal Post Plugin"] = "Habilitar plug-in para publicar no LiveJournal";
+$a->strings["Enable LiveJournal Post Addon"] = "Habilitar plug-in para publicar no LiveJournal";
 $a->strings["LiveJournal username"] = "Nome de usuário no LiveJournal";
 $a->strings["LiveJournal password"] = "Senha do LiveJournal";
 $a->strings["Post to LiveJournal by default"] = "Publicar no LiveJournal por padrão";
index 2393930af95adee3583791f4850a561badd602c5..546e49bb7bee13bd2dabb316b7091687d03611ea 100644 (file)
@@ -28,7 +28,7 @@ msgid "LiveJournal Post Settings"
 msgstr "Configurări Postări LiveJournal"
 
 #: ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
+msgid "Enable LiveJournal Post Addon"
 msgstr "Activare Modul Postare LiveJournal"
 
 #: ljpost.php:77
index 4bc21cc4f46038017b62cfdeb55c00f6c67d905b..b65c77549f451110809c871215eab9f4a7982191 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_ro($n){
 ;
 $a->strings["Post to LiveJournal"] = "Postați pe LiveJournal";
 $a->strings["LiveJournal Post Settings"] = "Configurări Postări LiveJournal";
-$a->strings["Enable LiveJournal Post Plugin"] = "Activare Modul Postare LiveJournal";
+$a->strings["Enable LiveJournal Post Addon"] = "Activare Modul Postare LiveJournal";
 $a->strings["LiveJournal username"] = "Utilizator LiveJournal";
 $a->strings["LiveJournal password"] = "Parolă LiveJournal ";
 $a->strings["Post to LiveJournal by default"] = "Postați implicit pe LiveJournal";
index 8e8474379d83ec40b74115908367df470bd65b7d..89a241cd26981004ccde8d9e686d1831ff068f2d 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to LiveJournal"] = "";\r
 $a->strings["LiveJournal Post Settings"] = "";\r
-$a->strings["Enable LiveJournal Post Plugin"] = "Включить LiveJournal  плагин сообщений";\r
+$a->strings["Enable LiveJournal Post Addon"] = "Включить LiveJournal  плагин сообщений";\r
 $a->strings["LiveJournal username"] = "";\r
 $a->strings["LiveJournal password"] = "";\r
 $a->strings["Post to LiveJournal by default"] = "";\r
index f34b63659f34a496d050099b79fe2e0822120d1b..579eac21d3afea9ecae723af8126359acac1fd01 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to LiveJournal"] = "转播到LiveJournal";\r
 $a->strings["LiveJournal Post Settings"] = "LiveJournal转播设置";\r
-$a->strings["Enable LiveJournal Post Plugin"] = "使Livejournal转播插件可用";\r
+$a->strings["Enable LiveJournal Post Addon"] = "使Livejournal转播插件可用";\r
 $a->strings["LiveJournal username"] = "LiveJournal用户名";\r
 $a->strings["LiveJournal password"] = "LiveJournal密码";\r
 $a->strings["Post to LiveJournal by default"] = "默认地转播到LiveJournal";\r
index c8690c26e18a1a1bfbdc352d7824e778d31278b2..7cfba81ed5074d1a12bb335982fe65c245488b4c 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Name: LiveJournal Post Connector
  * Description: Post to LiveJournal
@@ -9,20 +8,27 @@
  * Author: Cat Gray <https://free-haven.org/profile/catness>
  */
 
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
+
 function ljpost_install() {
-    register_hook('post_local',           'addon/ljpost/ljpost.php', 'ljpost_post_local');
-    register_hook('notifier_normal',      'addon/ljpost/ljpost.php', 'ljpost_send');
-    register_hook('jot_networks',         'addon/ljpost/ljpost.php', 'ljpost_jot_nets');
-    register_hook('connector_settings',      'addon/ljpost/ljpost.php', 'ljpost_settings');
-    register_hook('connector_settings_post', 'addon/ljpost/ljpost.php', 'ljpost_settings_post');
+    Addon::registerHook('post_local',           'addon/ljpost/ljpost.php', 'ljpost_post_local');
+    Addon::registerHook('notifier_normal',      'addon/ljpost/ljpost.php', 'ljpost_send');
+    Addon::registerHook('jot_networks',         'addon/ljpost/ljpost.php', 'ljpost_jot_nets');
+    Addon::registerHook('connector_settings',      'addon/ljpost/ljpost.php', 'ljpost_settings');
+    Addon::registerHook('connector_settings_post', 'addon/ljpost/ljpost.php', 'ljpost_settings_post');
 
 }
 function ljpost_uninstall() {
-    unregister_hook('post_local',       'addon/ljpost/ljpost.php', 'ljpost_post_local');
-    unregister_hook('notifier_normal',  'addon/ljpost/ljpost.php', 'ljpost_send');
-    unregister_hook('jot_networks',     'addon/ljpost/ljpost.php', 'ljpost_jot_nets');
-    unregister_hook('connector_settings',      'addon/ljpost/ljpost.php', 'ljpost_settings');
-    unregister_hook('connector_settings_post', 'addon/ljpost/ljpost.php', 'ljpost_settings_post');
+    Addon::unregisterHook('post_local',       'addon/ljpost/ljpost.php', 'ljpost_post_local');
+    Addon::unregisterHook('notifier_normal',  'addon/ljpost/ljpost.php', 'ljpost_send');
+    Addon::unregisterHook('jot_networks',     'addon/ljpost/ljpost.php', 'ljpost_jot_nets');
+    Addon::unregisterHook('connector_settings',      'addon/ljpost/ljpost.php', 'ljpost_settings');
+    Addon::unregisterHook('connector_settings_post', 'addon/ljpost/ljpost.php', 'ljpost_settings_post');
 
 }
 
@@ -36,7 +42,7 @@ function ljpost_jot_nets(&$a,&$b) {
         $lj_defpost = get_pconfig(local_user(),'ljpost','post_by_default');
         $selected = ((intval($lj_defpost) == 1) ? ' checked="checked" ' : '');
         $b .= '<div class="profile-jot-net"><input type="checkbox" name="ljpost_enable" ' . $selected . ' value="1" /> '
-            . t('Post to LiveJournal') . '</div>';
+            . L10n::t('Post to LiveJournal') . '</div>';
     }
 }
 
@@ -67,30 +73,30 @@ function ljpost_settings(&$a,&$s) {
     /* Add some HTML to the existing form */
 
     $s .= '<div class="settings-block">';
-    $s .= '<h3>' . t('LiveJournal Post Settings') . '</h3>';
+    $s .= '<h3>' . L10n::t('LiveJournal Post Settings') . '</h3>';
     $s .= '<div id="ljpost-enable-wrapper">';
-    $s .= '<label id="ljpost-enable-label" for="ljpost-checkbox">' . t('Enable LiveJournal Post Plugin') . '</label>';
+    $s .= '<label id="ljpost-enable-label" for="ljpost-checkbox">' . L10n::t('Enable LiveJournal Post Addon') . '</label>';
     $s .= '<input id="ljpost-checkbox" type="checkbox" name="ljpost" value="1" ' . $checked . '/>';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="ljpost-username-wrapper">';
-    $s .= '<label id="ljpost-username-label" for="ljpost-username">' . t('LiveJournal username') . '</label>';
+    $s .= '<label id="ljpost-username-label" for="ljpost-username">' . L10n::t('LiveJournal username') . '</label>';
     $s .= '<input id="ljpost-username" type="text" name="lj_username" value="' . $lj_username . '" />';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="ljpost-password-wrapper">';
-    $s .= '<label id="ljpost-password-label" for="ljpost-password">' . t('LiveJournal password') . '</label>';
+    $s .= '<label id="ljpost-password-label" for="ljpost-password">' . L10n::t('LiveJournal password') . '</label>';
     $s .= '<input id="ljpost-password" type="password" name="lj_password" value="' . $lj_password . '" />';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="ljpost-bydefault-wrapper">';
-    $s .= '<label id="ljpost-bydefault-label" for="ljpost-bydefault">' . t('Post to LiveJournal by default') . '</label>';
+    $s .= '<label id="ljpost-bydefault-label" for="ljpost-bydefault">' . L10n::t('Post to LiveJournal by default') . '</label>';
     $s .= '<input id="ljpost-bydefault" type="checkbox" name="lj_bydefault" value="1" ' . $def_checked . '/>';
     $s .= '</div><div class="clear"></div>';
 
     /* provide a submit button */
 
-    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="ljpost-submit" name="ljpost-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="ljpost-submit" name="ljpost-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
 }
 
@@ -173,16 +179,12 @@ function ljpost_send(&$a,&$b) {
                $lj_blog = xmlify('http://www.livejournal.com/interface/xmlrpc');
 
        if($lj_username && $lj_password && $lj_blog) {
-
-               require_once('include/bbcode.php');
-               require_once('include/datetime.php');
-
                $title = xmlify($b['title']);
-               $post = bbcode($b['body']);
+               $post = BBCode::convert($b['body']);
                $post = xmlify($post);
                $tags = ljpost_get_tags($b['tag']);
 
-               $date = datetime_convert('UTC',$tz,$b['created'],'Y-m-d H:i:s');
+               $date = DateTimeFormat::convert($b['created'], $tz);
                $year = intval(substr($date,0,4));
                $mon  = intval(substr($date,5,2));
                $day  = intval(substr($date,8,2));
@@ -231,10 +233,10 @@ EOT;
 
                logger('ljpost: data: ' . $xml, LOGGER_DATA);
 
-               if($lj_blog !== 'test')
-                       $x = post_url($lj_blog,$xml,array("Content-Type: text/xml"));
+               if ($lj_blog !== 'test') {
+                       $x = Network::post($lj_blog, $xml, ["Content-Type: text/xml"]);
+               }
                logger('posted to livejournal: ' . ($x) ? $x : '', LOGGER_DEBUG);
-
        }
 }
 
index 977c693d765d4c510528a1ba66654a199d02dab0..3567792b4df645f35878dd817778678c7d2181d0 100644 (file)
@@ -6,14 +6,14 @@
  * Version: 1.0\r
  * Author: Holger Froese\r
  */\r
-\r
+use Friendica\Core\Addon;\r
 \r
 function mahjongg_install() {\r
-    register_hook('app_menu', 'addon/mahjongg/mahjongg.php', 'mahjongg_app_menu');\r
+    Addon::registerHook('app_menu', 'addon/mahjongg/mahjongg.php', 'mahjongg_app_menu');\r
 }\r
 \r
 function mahjongg_uninstall() {\r
-    unregister_hook('app_menu', 'addon/mahjongg/mahjongg.php', 'mahjongg_app_menu');\r
+    Addon::unregisterHook('app_menu', 'addon/mahjongg/mahjongg.php', 'mahjongg_app_menu');\r
 \r
 }\r
 \r
index ac528cc60f031339966e7538853aa7173a405f81..80344780cc1c2d35f92f9b74faf0f7f010c910e8 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 14:45+0200\n"
+"POT-Creation-Date: 2018-03-11 19:13+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,62 +17,80 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: mailstream.php:55
+#: mailstream.php:77
 msgid "From Address"
 msgstr ""
 
-#: mailstream.php:57
+#: mailstream.php:79
 msgid "Email address that stream items will appear to be from."
 msgstr ""
 
-#: mailstream.php:60 mailstream.php:282
+#: mailstream.php:82 mailstream.php:380
 msgid "Save Settings"
 msgstr ""
 
-#: mailstream.php:165
+#: mailstream.php:223
 msgid "Re:"
 msgstr ""
 
-#: mailstream.php:173
+#: mailstream.php:231
 msgid "Friendica post"
 msgstr ""
 
-#: mailstream.php:176
+#: mailstream.php:234
 msgid "Diaspora post"
 msgstr ""
 
-#: mailstream.php:183
+#: mailstream.php:244
 msgid "Feed item"
 msgstr ""
 
-#: mailstream.php:186
+#: mailstream.php:247
 msgid "Email"
 msgstr ""
 
-#: mailstream.php:188
+#: mailstream.php:249
 msgid "Friendica Item"
 msgstr ""
 
-#: mailstream.php:229
+#: mailstream.php:293
 msgid "Upstream"
 msgstr ""
 
-#: mailstream.php:230
+#: mailstream.php:294
 msgid "Local"
 msgstr ""
 
-#: mailstream.php:274
+#: mailstream.php:362
+msgid "Enabled"
+msgstr ""
+
+#: mailstream.php:366
 msgid "Email Address"
 msgstr ""
 
-#: mailstream.php:276
+#: mailstream.php:368
 msgid "Leave blank to use your account email address"
 msgstr ""
 
-#: mailstream.php:279
-msgid "Enabled"
+#: mailstream.php:371
+msgid "Exclude Likes"
+msgstr ""
+
+#: mailstream.php:373
+msgid "Check this to omit mailing \"Like\" notifications"
+msgstr ""
+
+#: mailstream.php:376
+msgid "Attach Images"
+msgstr ""
+
+#: mailstream.php:378
+msgid ""
+"Download images in posts and attach them to the email.  Useful for reading "
+"email while offline."
 msgstr ""
 
-#: mailstream.php:281
+#: mailstream.php:379
 msgid "Mail Stream Settings"
 msgstr ""
index f23ff1069117657c048038687b07c192b46858f0..bf170ba2892896410c1f9f120e4aabd1cab62577 100644 (file)
@@ -4,77 +4,96 @@
 # 
 # 
 # Translators:
-# Abrax <webmaster@a-zwenkau.de>, 2014
+# Andreas H., 2014
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 14:45+0200\n"
-"PO-Revision-Date: 2014-10-14 09:25+0000\n"
-"Last-Translator: Abrax <webmaster@a-zwenkau.de>\n"
-"Language-Team: German (http://www.transifex.com/projects/p/friendica/language/de/)\n"
+"POT-Creation-Date: 2018-03-11 19:13+0100\n"
+"PO-Revision-Date: 2018-03-16 07:45+0000\n"
+"Last-Translator: Tobias Diekershoff <tobias.diekershoff@gmx.net>\n"
+"Language-Team: German (http://www.transifex.com/Friendica/friendica/language/de/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: de\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: mailstream.php:55
+#: mailstream.php:77
 msgid "From Address"
 msgstr "Absender"
 
-#: mailstream.php:57
+#: mailstream.php:79
 msgid "Email address that stream items will appear to be from."
 msgstr "E-Mail-Adresse, die in hochgeladenen Artikeln erscheint."
 
-#: mailstream.php:60 mailstream.php:282
+#: mailstream.php:82 mailstream.php:380
 msgid "Save Settings"
 msgstr "Einstellungen speichern"
 
-#: mailstream.php:165
+#: mailstream.php:223
 msgid "Re:"
 msgstr "Re:"
 
-#: mailstream.php:173
+#: mailstream.php:231
 msgid "Friendica post"
 msgstr "Friendica Veröffentlichung"
 
-#: mailstream.php:176
+#: mailstream.php:234
 msgid "Diaspora post"
 msgstr "Diaspora Veröffentlichung"
 
-#: mailstream.php:183
+#: mailstream.php:244
 msgid "Feed item"
 msgstr "Artikel-Feed"
 
-#: mailstream.php:186
+#: mailstream.php:247
 msgid "Email"
 msgstr "E-Mail"
 
-#: mailstream.php:188
+#: mailstream.php:249
 msgid "Friendica Item"
 msgstr "Friendica Artikel"
 
-#: mailstream.php:229
+#: mailstream.php:293
 msgid "Upstream"
 msgstr "Upstream"
 
-#: mailstream.php:230
+#: mailstream.php:294
 msgid "Local"
 msgstr "Lokal"
 
-#: mailstream.php:274
+#: mailstream.php:362
+msgid "Enabled"
+msgstr "eingeschaltet"
+
+#: mailstream.php:366
 msgid "Email Address"
 msgstr "E-Mail-Adresse"
 
-#: mailstream.php:276
+#: mailstream.php:368
 msgid "Leave blank to use your account email address"
 msgstr "Leer lassen für Deine Konto-E-Mail-Addresse"
 
-#: mailstream.php:279
-msgid "Enabled"
-msgstr "eingeschaltet"
+#: mailstream.php:371
+msgid "Exclude Likes"
+msgstr "Likes ignorieren"
+
+#: mailstream.php:373
+msgid "Check this to omit mailing \"Like\" notifications"
+msgstr "Diese Option verhindert das versenden von \"Like\"-Benachrichtigungen per E-Mail."
+
+#: mailstream.php:376
+msgid "Attach Images"
+msgstr "Bolder anhängen"
+
+#: mailstream.php:378
+msgid ""
+"Download images in posts and attach them to the email.  Useful for reading "
+"email while offline."
+msgstr "Sollen Bilder die im Beitrag eingebettet sind als Dateianhang in den E-Mails mit verschickt werden?"
 
-#: mailstream.php:281
+#: mailstream.php:379
 msgid "Mail Stream Settings"
 msgstr "Mail-Nachrichten Einstellungen"
index d838f4dc3374bc2193cf97fb88359d81859a275c..90e9210d9fbb9ee0e7ec1bbb8bbbaa276e3524a3 100644 (file)
@@ -16,7 +16,11 @@ $a->strings["Email"] = "E-Mail";
 $a->strings["Friendica Item"] = "Friendica Artikel";
 $a->strings["Upstream"] = "Upstream";
 $a->strings["Local"] = "Lokal";
+$a->strings["Enabled"] = "eingeschaltet";
 $a->strings["Email Address"] = "E-Mail-Adresse";
 $a->strings["Leave blank to use your account email address"] = "Leer lassen für Deine Konto-E-Mail-Addresse";
-$a->strings["Enabled"] = "eingeschaltet";
+$a->strings["Exclude Likes"] = "Likes ignorieren";
+$a->strings["Check this to omit mailing \"Like\" notifications"] = "Diese Option verhindert das versenden von \"Like\"-Benachrichtigungen per E-Mail.";
+$a->strings["Attach Images"] = "Bolder anhängen";
+$a->strings["Download images in posts and attach them to the email.  Useful for reading email while offline."] = "Sollen Bilder die im Beitrag eingebettet sind als Dateianhang in den E-Mails mit verschickt werden?";
 $a->strings["Mail Stream Settings"] = "Mail-Nachrichten Einstellungen";
index 6ee63621cd980df54bbdbae583e7e4508c4d1ee2..2d05f1201e8caceba9d866e78c9d239707c420da 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 14:45+0200\n"
-"PO-Revision-Date: 2014-09-10 13:02+0000\n"
+"POT-Creation-Date: 2018-03-11 19:13+0100\n"
+"PO-Revision-Date: 2018-03-19 13:12+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -19,62 +19,80 @@ msgstr ""
 "Language: it\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: mailstream.php:55
+#: mailstream.php:77
 msgid "From Address"
 msgstr "Indirizzo di invio"
 
-#: mailstream.php:57
+#: mailstream.php:79
 msgid "Email address that stream items will appear to be from."
 msgstr "Indirizzo email da cui i messaggi appariranno inviati"
 
-#: mailstream.php:60 mailstream.php:282
+#: mailstream.php:82 mailstream.php:380
 msgid "Save Settings"
 msgstr "Salva Impostazioni"
 
-#: mailstream.php:165
+#: mailstream.php:223
 msgid "Re:"
 msgstr "R:"
 
-#: mailstream.php:173
+#: mailstream.php:231
 msgid "Friendica post"
 msgstr "Messaggio Friendica"
 
-#: mailstream.php:176
+#: mailstream.php:234
 msgid "Diaspora post"
 msgstr "Messaggio Diaspora"
 
-#: mailstream.php:183
+#: mailstream.php:244
 msgid "Feed item"
 msgstr "Elemento da feed"
 
-#: mailstream.php:186
+#: mailstream.php:247
 msgid "Email"
 msgstr "Email"
 
-#: mailstream.php:188
+#: mailstream.php:249
 msgid "Friendica Item"
 msgstr "Elemento da Friendica"
 
-#: mailstream.php:229
+#: mailstream.php:293
 msgid "Upstream"
 msgstr "Upstream"
 
-#: mailstream.php:230
+#: mailstream.php:294
 msgid "Local"
 msgstr "Locale"
 
-#: mailstream.php:274
+#: mailstream.php:362
+msgid "Enabled"
+msgstr "Abilitato"
+
+#: mailstream.php:366
 msgid "Email Address"
 msgstr "Indirizzo Email"
 
-#: mailstream.php:276
+#: mailstream.php:368
 msgid "Leave blank to use your account email address"
 msgstr "Lascia in bianco per usare l'indirizzo email del tuo account"
 
-#: mailstream.php:279
-msgid "Enabled"
-msgstr "Abilitato"
+#: mailstream.php:371
+msgid "Exclude Likes"
+msgstr "Escludi \"Mi Piace\""
+
+#: mailstream.php:373
+msgid "Check this to omit mailing \"Like\" notifications"
+msgstr "Seleziona per evitare di inviare notifiche per \"Mi Piace\""
+
+#: mailstream.php:376
+msgid "Attach Images"
+msgstr "Allega Immagini"
+
+#: mailstream.php:378
+msgid ""
+"Download images in posts and attach them to the email.  Useful for reading "
+"email while offline."
+msgstr "Scarica le immagini nei messaggi e le allega alle email. Utile per leggere le email mentre si è offline."
 
-#: mailstream.php:281
+#: mailstream.php:379
 msgid "Mail Stream Settings"
 msgstr "Impostazioni Mail Stream"
index 7c8402bbf3dc5c764db44a6885d0d0ed054296d9..a6a4828763f3bf482c0081bab68535af42044f50 100644 (file)
@@ -16,7 +16,11 @@ $a->strings["Email"] = "Email";
 $a->strings["Friendica Item"] = "Elemento da Friendica";
 $a->strings["Upstream"] = "Upstream";
 $a->strings["Local"] = "Locale";
+$a->strings["Enabled"] = "Abilitato";
 $a->strings["Email Address"] = "Indirizzo Email";
 $a->strings["Leave blank to use your account email address"] = "Lascia in bianco per usare l'indirizzo email del tuo account";
-$a->strings["Enabled"] = "Abilitato";
+$a->strings["Exclude Likes"] = "Escludi \"Mi Piace\"";
+$a->strings["Check this to omit mailing \"Like\" notifications"] = "Seleziona per evitare di inviare notifiche per \"Mi Piace\"";
+$a->strings["Attach Images"] = "Allega Immagini";
+$a->strings["Download images in posts and attach them to the email.  Useful for reading email while offline."] = "Scarica le immagini nei messaggi e le allega alle email. Utile per leggere le email mentre si è offline.";
 $a->strings["Mail Stream Settings"] = "Impostazioni Mail Stream";
index c3e4974de2225ab5df9d443e3d0ee51db4e40eec..50f820e7e2d09948df9415dccbf30744031a6667 100644 (file)
@@ -6,12 +6,20 @@
  * Author: Matthew Exon <http://mat.exon.name>
  */
 
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Database\DBM;
+use Friendica\Util\Network;
+
 function mailstream_install() {
-       register_hook('plugin_settings', 'addon/mailstream/mailstream.php', 'mailstream_plugin_settings');
-       register_hook('plugin_settings_post', 'addon/mailstream/mailstream.php', 'mailstream_plugin_settings_post');
-       register_hook('post_local_end', 'addon/mailstream/mailstream.php', 'mailstream_post_hook');
-       register_hook('post_remote_end', 'addon/mailstream/mailstream.php', 'mailstream_post_hook');
-       register_hook('cron', 'addon/mailstream/mailstream.php', 'mailstream_cron');
+       Addon::registerHook('addon_settings', 'addon/mailstream/mailstream.php', 'mailstream_addon_settings');
+       Addon::registerHook('addon_settings_post', 'addon/mailstream/mailstream.php', 'mailstream_addon_settings_post');
+       Addon::registerHook('post_local_end', 'addon/mailstream/mailstream.php', 'mailstream_post_hook');
+       Addon::registerHook('post_remote_end', 'addon/mailstream/mailstream.php', 'mailstream_post_hook');
+       Addon::registerHook('cron', 'addon/mailstream/mailstream.php', 'mailstream_cron');
 
        if (get_config('mailstream', 'dbversion') == '0.1') {
                q('ALTER TABLE `mailstream_item` DROP INDEX `uid`');
@@ -48,33 +56,33 @@ function mailstream_install() {
 }
 
 function mailstream_uninstall() {
-       unregister_hook('plugin_settings', 'addon/mailstream/mailstream.php', 'mailstream_plugin_settings');
-       unregister_hook('plugin_settings_post', 'addon/mailstream/mailstream.php', 'mailstream_plugin_settings_post');
-       unregister_hook('post_local', 'addon/mailstream/mailstream.php', 'mailstream_post_local_hook');
-       unregister_hook('post_remote', 'addon/mailstream/mailstream.php', 'mailstream_post_remote_hook');
-       unregister_hook('post_local_end', 'addon/mailstream/mailstream.php', 'mailstream_post_local_hook');
-       unregister_hook('post_remote_end', 'addon/mailstream/mailstream.php', 'mailstream_post_remote_hook');
-       unregister_hook('post_local_end', 'addon/mailstream/mailstream.php', 'mailstream_post_hook');
-       unregister_hook('post_remote_end', 'addon/mailstream/mailstream.php', 'mailstream_post_hook');
-       unregister_hook('cron', 'addon/mailstream/mailstream.php', 'mailstream_cron');
-       unregister_hook('incoming_mail', 'addon/mailstream/mailstream.php', 'mailstream_incoming_mail');
+       Addon::unregisterHook('addon_settings', 'addon/mailstream/mailstream.php', 'mailstream_addon_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/mailstream/mailstream.php', 'mailstream_addon_settings_post');
+       Addon::unregisterHook('post_local', 'addon/mailstream/mailstream.php', 'mailstream_post_local_hook');
+       Addon::unregisterHook('post_remote', 'addon/mailstream/mailstream.php', 'mailstream_post_remote_hook');
+       Addon::unregisterHook('post_local_end', 'addon/mailstream/mailstream.php', 'mailstream_post_local_hook');
+       Addon::unregisterHook('post_remote_end', 'addon/mailstream/mailstream.php', 'mailstream_post_remote_hook');
+       Addon::unregisterHook('post_local_end', 'addon/mailstream/mailstream.php', 'mailstream_post_hook');
+       Addon::unregisterHook('post_remote_end', 'addon/mailstream/mailstream.php', 'mailstream_post_hook');
+       Addon::unregisterHook('cron', 'addon/mailstream/mailstream.php', 'mailstream_cron');
+       Addon::unregisterHook('incoming_mail', 'addon/mailstream/mailstream.php', 'mailstream_incoming_mail');
 }
 
 function mailstream_module() {}
 
-function mailstream_plugin_admin(&$a,&$o) {
-       $frommail = get_config('mailstream', 'frommail');
+function mailstream_addon_admin(&$a,&$o) {
+       $frommail = Config::get('mailstream', 'frommail');
        $template = get_markup_template('admin.tpl', 'addon/mailstream/');
-       $config = array('frommail',
-                       t('From Address'),
+       $config = ['frommail',
+                       L10n::t('From Address'),
                        $frommail,
-                       t('Email address that stream items will appear to be from.'));
-       $o .= replace_macros($template, array(
+                       L10n::t('Email address that stream items will appear to be from.')];
+       $o .= replace_macros($template, [
                                 '$frommail' => $config,
-                                '$submit' => t('Save Settings')));
+                                '$submit' => L10n::t('Save Settings')]);
 }
 
-function mailstream_plugin_admin_post ($a) {
+function mailstream_addon_admin_post ($a) {
        if (x($_POST, 'frommail')) {
                set_config('mailstream', 'frommail', $_POST['frommail']);
        }
@@ -149,8 +157,8 @@ function mailstream_do_images($a, &$item, &$attachments) {
        foreach (array_merge($matches1[3], $matches2[1]) as $url) {
                $redirects;
                $cookiejar = tempnam(get_temppath(), 'cookiejar-mailstream-');
-               $attachments[$url] = array(
-                       'data' => fetch_url($url, true, $redirects, 0, Null, $cookiejar),
+               $attachments[$url] = [
+                       'data' => Network::fetchUrl($url, true, $redirects, 0, null, $cookiejar),
                        'guid' => hash("crc32", $url),
                        'filename' => basename($url),
                        'type' => $a->get_curl_content_type());
@@ -174,7 +182,7 @@ function mailstream_sender($item) {
 }
 
 function mailstream_decode_subject($subject) {
-       $html = bbcode($subject);
+       $html = BBCode::convert($subject);
        if (!$html) {
                return $subject;
        }
@@ -212,7 +220,7 @@ function mailstream_subject($item) {
                        break;
                }
                if ($r[0]['title']) {
-                       return t('Re:') . ' ' . mailstream_decode_subject($r[0]['title']);
+                       return L10n::t('Re:') . ' ' . mailstream_decode_subject($r[0]['title']);
                }
                $parent = $r[0]['thr-parent'];
        }
@@ -220,10 +228,10 @@ function mailstream_subject($item) {
                intval($item['contact-id']), intval($item['uid']));
        $contact = $r[0];
        if ($contact['network'] === 'dfrn') {
-               return t("Friendica post");
+               return L10n::t("Friendica post");
        }
        if ($contact['network'] === 'dspr') {
-               return t("Diaspora post");
+               return L10n::t("Diaspora post");
        }
        if ($contact['network'] === 'face') {
                $text = mailstream_decode_subject($item['body']);
@@ -233,12 +241,12 @@ function mailstream_subject($item) {
                return preg_replace('/\\s+/', ' ', $subject);
        }
        if ($contact['network'] === 'feed') {
-               return t("Feed item");
+               return L10n::t("Feed item");
        }
        if ($contact['network'] === 'mail') {
-               return t("Email");
+               return L10n::t("Email");
        }
-       return t("Friendica Item");
+       return L10n::t("Friendica Item");
 }
 
 function mailstream_send($a, $message_id, $item, $user) {
@@ -249,8 +257,8 @@ function mailstream_send($a, $message_id, $item, $user) {
                return;
        }
        require_once(dirname(__file__).'/phpmailer/class.phpmailer.php');
-       require_once('include/bbcode.php');
-       $attachments = array();
+
+       $attachments = [];
        mailstream_do_images($a, $item, $attachments);
        $frommail = get_config('mailstream', 'frommail');
        if ($frommail == "") {
@@ -262,7 +270,7 @@ function mailstream_send($a, $message_id, $item, $user) {
        }
        $mail = new PHPmailer;
        try {
-               $mail->XMailer = 'Friendica Mailstream Plugin';
+               $mail->XMailer = 'Friendica Mailstream Addon';
                $mail->SetFrom($frommail, mailstream_sender($item));
                $mail->AddAddress($address, $user['username']);
                $mail->MessageID = $message_id;
@@ -279,12 +287,12 @@ function mailstream_send($a, $message_id, $item, $user) {
                $mail->IsHTML(true);
                $mail->CharSet = 'utf-8';
                $template = get_markup_template('mail.tpl', 'addon/mailstream/');
-               $item['body'] = bbcode($item['body']);
+               $item['body'] = BBCode::convert($item['body']);
                $item['url'] = $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $item['id'];
-               $mail->Body = replace_macros($template, array(
-                                                '$upstream' => t('Upstream'),
-                                                '$local' => t('Local'),
-                                                '$item' => $item));
+               $mail->Body = replace_macros($template, [
+                                                '$upstream' => L10n::t('Upstream'),
+                                                '$local' => L10n::t('Local'),
+                                                '$item' => $item]);
                mailstream_html_wrap($mail->Body);
                if (!$mail->Send()) {
                        throw new Exception($mail->ErrorInfo);
@@ -342,37 +350,37 @@ function mailstream_cron($a, $b) {
        mailstream_tidy();
 }
 
-function mailstream_plugin_settings(&$a,&$s) {
-       $enabled = get_pconfig(local_user(), 'mailstream', 'enabled');
-       $address = get_pconfig(local_user(), 'mailstream', 'address');
-       $nolikes = get_pconfig(local_user(), 'mailstream', 'nolikes');
-       $attachimg= get_pconfig(local_user(), 'mailstream', 'attachimg');
+function mailstream_addon_settings(&$a,&$s) {
+       $enabled = PConfig::get(local_user(), 'mailstream', 'enabled');
+       $address = PConfig::get(local_user(), 'mailstream', 'address');
+       $nolikes = PConfig::get(local_user(), 'mailstream', 'nolikes');
+       $attachimg= PConfig::get(local_user(), 'mailstream', 'attachimg');
        $template = get_markup_template('settings.tpl', 'addon/mailstream/');
        $s .= replace_macros($template, array(
                                 '$enabled' => array(
                                        'mailstream_enabled',
-                                       t('Enabled'),
-                                       $enabled),
-                                '$address' => array(
+                                       L10n::t('Enabled'),
+                                       $enabled],
+                                '$address' => [
                                        'mailstream_address',
-                                       t('Email Address'),
+                                       L10n::t('Email Address'),
                                        $address,
-                                       t("Leave blank to use your account email address")),
-                                '$nolikes' => array(
+                                       L10n::t("Leave blank to use your account email address")],
+                                '$nolikes' => [
                                        'mailstream_nolikes',
-                                       t('Exclude Likes'),
+                                       L10n::t('Exclude Likes'),
                                        $nolikes,
-                                       t("Check this to omit mailing \"Like\" notifications")),
-                                '$attachimg' => array(
+                                       L10n::t("Check this to omit mailing \"Like\" notifications")],
+                                '$attachimg' => [
                                        'mailstream_attachimg',
-                                       t('Attach Images'),
+                                       L10n::t('Attach Images'),
                                        $attachimg,
-                                       t("Download images in posts and attach them to the email.  Useful for reading email while offline.")),
-                                '$title' => t('Mail Stream Settings'),
-                                '$submit' => t('Save Settings')));
+                                       L10n::t("Download images in posts and attach them to the email.  Useful for reading email while offline.")],
+                                '$title' => L10n::t('Mail Stream Settings'),
+                                '$submit' => L10n::t('Save Settings')]);
 }
 
-function mailstream_plugin_settings_post($a,$post) {
+function mailstream_addon_settings_post($a,$post) {
        if ($_POST['mailstream_address'] != "") {
                set_pconfig(local_user(), 'mailstream', 'address', $_POST['mailstream_address']);
        }
index 8ff13f11046ae84bc49d2397ef49ec9e3e93ba80..c2611e8603eaab67c155c05355325292b1289cc3 100644 (file)
@@ -176,7 +176,7 @@ class PHPMailer
     public $UseSendmailOptions = true;
 
     /**
-     * Path to PHPMailer plugins.
+     * Path to PHPMailer addons.
      * Useful if the SMTP class is not in the PHP include path.
      * @var string
      * @deprecated Should not be needed now there is an autoloader.
index 376108285a770f2c60bc76758cb3aebe59098986..599837babec58c574c00710c5091bd2078aaf107 100644 (file)
@@ -1,5 +1,10 @@
-<div class="settings-block">
-  <h3>{{$title}}</h3>
+<span id="settings_mailstream_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose('settings_mailstream_expanded'); openClose('settings_mailstream_inflated');">
+       <h3>{{$title}}</h3>
+</span>
+<div id="settings_mailstream_expanded" class="settings-block" style="display: none;">
+       <span class="fakelink" onclick="openClose('settings_mailstream_expanded'); openClose('settings_mailstream_inflated');">
+               <h3>{{$title}}</h3>
+       </span>
 {{include file="field_checkbox.tpl" field=$enabled}}
 {{include file="field_input.tpl" field=$address}}
 {{include file="field_checkbox.tpl" field=$nolikes}}
index 826737335ccbe0382280a957bcd1b4e229f29257..f44812c3425a1aebedb3e73633e7f659dc4ccac7 100644 (file)
@@ -28,7 +28,7 @@ msgid ""
 "The MathJax addon renders mathematical formulae written using the LaTeX "
 "syntax surrounded by the usual $$ or an eqnarray block in the postings of "
 "your wall,network tab and private mail."
-msgstr "Il plugin \"MatJax\" renderizza formule matematiche scritta usando la sintassi LaTeX circondate dalle usuali $$ o un blocco eqnarray nei messaggi della tua bacheca, pagina Rete e messaggi privati."
+msgstr "Iladdon\"MatJax\" renderizza formule matematiche scritta usando la sintassi LaTeX circondate dalle usuali $$ o un blocco eqnarray nei messaggi della tua bacheca, pagina Rete e messaggi privati."
 
 #: mathjax.php:38
 msgid "Use the MathJax renderer"
index 1481d731d3455b88751d6ab7dde0b9f7805741f7..1743933899e4432a9b7cb1c3d58d86faba43ec53 100644 (file)
@@ -6,7 +6,7 @@ function string_plural_select_it($n){
 }}
 ;
 $a->strings["Settings"] = "Impostazioni";
-$a->strings["The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail."] = "Il plugin \"MatJax\" renderizza formule matematiche scritta usando la sintassi LaTeX circondate dalle usuali $$ o un blocco eqnarray nei messaggi della tua bacheca, pagina Rete e messaggi privati.";
+$a->strings["The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail."] = "Iladdon\"MatJax\" renderizza formule matematiche scritta usando la sintassi LaTeX circondate dalle usuali $$ o un blocco eqnarray nei messaggi della tua bacheca, pagina Rete e messaggi privati.";
 $a->strings["Use the MathJax renderer"] = "Usa il render MathJax";
 $a->strings["Submit"] = "Invia";
 $a->strings["Settings updated."] = "Impostazioni aggiornate.";
diff --git a/mathjax/lang/zh-cn/messages.po b/mathjax/lang/zh-cn/messages.po
new file mode 100644 (file)
index 0000000..4e464fb
--- /dev/null
@@ -0,0 +1,53 @@
+# ADDON mathjax
+# Copyright (C)
+# This file is distributed under the same license as the Friendica mathjax addon package.
+# 
+# 
+# Translators:
+# 朱陈锬 <tangenters@outlook.com>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-02-27 05:01-0500\n"
+"PO-Revision-Date: 2018-03-01 09:50+0000\n"
+"Last-Translator: 朱陈锬 <tangenters@outlook.com>\n"
+"Language-Team: Chinese (China) (http://www.transifex.com/Friendica/friendica/language/zh_CN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: mathjax.php:36
+msgid "Settings"
+msgstr "设置"
+
+#: mathjax.php:37
+msgid ""
+"The MathJax addon renders mathematical formulae written using the LaTeX "
+"syntax surrounded by the usual $$ or an eqnarray block in the postings of "
+"your wall,network tab and private mail."
+msgstr ""
+
+#: mathjax.php:38
+msgid "Use the MathJax renderer"
+msgstr "使用 MathJax 渲染"
+
+#: mathjax.php:42
+msgid "Submit"
+msgstr "提交"
+
+#: mathjax.php:66
+msgid "Settings updated."
+msgstr "设置已更新"
+
+#: mathjax.php:75
+msgid "MathJax Base URL"
+msgstr ""
+
+#: mathjax.php:75
+msgid ""
+"The URL for the javascript file that should be included to use MathJax. Can "
+"be either the MathJax CDN or another installation of MathJax."
+msgstr ""
index 24ac6e990fe7b7f2f51cff05ca80d690a4f2f48e..05103a5dbcaaaf6cbc6847a1b2c150e834b9dbf8 100644 (file)
@@ -1,9 +1,14 @@
-<?php\r
-\r
-$a->strings["Settings"] = "配置";\r
-$a->strings["The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail."] = "MathJax插件表示用LaTeX句法的数学公式,围绕$";\r
-$a->strings["Use the MathJax renderer"] = "用MathJax表示器";\r
-$a->strings["Submit"] = "提交";\r
-$a->strings["Settings updated."] = "设置跟新了";\r
-$a->strings["MathJax Base URL"] = "MathJax基础URL";\r
-$a->strings["The URL for the javascript file that should be included to use MathJax. Can be either the MathJax CDN or another installation of MathJax."] = "URL JavaScript文件应该包括为用MathJax。可以MathJax CDN或者别的MathJax安装。";\r
+<?php
+
+if(! function_exists("string_plural_select_zh_cn")) {
+function string_plural_select_zh_cn($n){
+       return 0;;
+}}
+;
+$a->strings["Settings"] = "设置";
+$a->strings["The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail."] = "";
+$a->strings["Use the MathJax renderer"] = "使用 MathJax 渲染";
+$a->strings["Submit"] = "提交";
+$a->strings["Settings updated."] = "设置已更新";
+$a->strings["MathJax Base URL"] = "";
+$a->strings["The URL for the javascript file that should be included to use MathJax. Can be either the MathJax CDN or another installation of MathJax."] = "";
index 9bff86a2a56bf04f76c021bdd30a587fe66f71ae..62c33c9c191713de4d5f5cb8547c48fea14838e2 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Name: MathJax
  * Description: Addon for Friendika to include MathJax (LaTeX math syntax)
@@ -7,17 +6,21 @@
  * Author: Tobias Diekershoff <https://f.diekershoff.de/profile/tobias>
  * License: 3-clause BSD license
  */
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 function mathjax_install() {
-    register_hook('page_header', 'addon/mathjax/mathjax.php', 'mathjax_page_header');
-    register_hook('plugin_settings', 'addon/mathjax/mathjax.php', 'mathjax_settings'); 
-    register_hook('plugin_settings_post', 'addon/mathjax/mathjax.php', 'mathjax_settings_post');
-    logger('installed js_math plugin');
+    Addon::registerHook('page_header', 'addon/mathjax/mathjax.php', 'mathjax_page_header');
+    Addon::registerHook('addon_settings', 'addon/mathjax/mathjax.php', 'mathjax_settings');
+    Addon::registerHook('addon_settings_post', 'addon/mathjax/mathjax.php', 'mathjax_settings_post');
+    logger('installed js_math addon');
 }
 function mathjax_uninstall() {
-    unregister_hook('page_header', 'addon/mathjax/mathjax.php', 'mathjax_page_header');
-    unregister_hook('plugin_settings', 'addon/mathjax/mathjax.php', 'mathjax_settings'); 
-    unregister_hook('plugin_settings_post', 'addon/mathjax/mathjax.php', 'mathjax_settings_post');
+    Addon::unregisterHook('page_header', 'addon/mathjax/mathjax.php', 'mathjax_page_header');
+    Addon::unregisterHook('addon_settings', 'addon/mathjax/mathjax.php', 'mathjax_settings');
+    Addon::unregisterHook('addon_settings_post', 'addon/mathjax/mathjax.php', 'mathjax_settings_post');
 }
 function mathjax_settings_post ($a, $post) {
     if (! local_user())
@@ -33,18 +36,18 @@ function mathjax_settings (&$a, &$s) {
     $use = get_pconfig(local_user(),'mathjax','use');
     $usetext = (($use) ? ' checked="checked" ' : '');
     $s .= '<span id="settings_mathjax_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_mathjax_expanded\'); openClose(\'settings_mathjax_inflated\');">';
-    $s .= '<h3>MathJax '.t('Settings').'</h3>';
+    $s .= '<h3>MathJax '.L10n::t('Settings').'</h3>';
     $s .= '</span>';
     $s .= '<div id="settings_mathjax_expanded" class="settings-block" style="display: none;">';
     $s .= '<span class="fakelink" onclick="openClose(\'settings_mathjax_expanded\'); openClose(\'settings_mathjax_inflated\');">';
-    $s .= '<h3>MathJax '.t('Settings').'</h3>';
+    $s .= '<h3>MathJax '.L10n::t('Settings').'</h3>';
     $s .= '</span>';
-    $s .= '<p>'.t('The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail.').'</p>';
-    $s .= '<label id="mathjax_label" for="mathjax_use">'.t('Use the MathJax renderer').'</label>';
+    $s .= '<p>'.L10n::t('The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail.').'</p>';
+    $s .= '<label id="mathjax_label" for="mathjax_use">'.L10n::t('Use the MathJax renderer').'</label>';
     $s .= '<input id="mathjax_use" type="checkbox" name="mathjax_use" value="1"'. $usetext .' />';
     $s .= '<div class="clear"></div>';
 
-    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="mathjax-submit" name="mathjax-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="mathjax-submit" name="mathjax-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
     $s .= '</div>';
 }
 /*  we need to add one JavaScript include command to the html output
@@ -65,19 +68,19 @@ function mathjax_page_header($a, &$b) {
         }
     }
 }
-function mathjax_plugin_admin_post (&$a) {
+function mathjax_addon_admin_post (&$a) {
     $baseurl = ((x($_POST, 'baseurl')) ? trim($_POST['baseurl']) : 'http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML');
-    set_config('mathjax','baseurl',$baseurl);
-    info( t('Settings updated.'). EOL);
+    Config::set('mathjax','baseurl',$baseurl);
+    info(L10n::t('Settings updated.'). EOL);
 }
-function mathjax_plugin_admin (&$a, &$o) {
+function mathjax_addon_admin (&$a, &$o) {
        $t = get_markup_template( "admin.tpl", "addon/mathjax/" );
        if (get_config('mathjax','baseurl','') == '') {
                set_config('mathjax','baseurl','http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML');
        }
 
-       $o = replace_macros( $t, array(
-               '$submit' => t('Save Settings'),
-               '$baseurl' => array('baseurl', t('MathJax Base URL'), get_config('mathjax','baseurl' ), t('The URL for the javascript file that should be included to use MathJax. Can be either the MathJax CDN or another installation of MathJax.')),
-       ));
+       $o = replace_macros( $t, [
+               '$submit' => L10n::t('Save Settings'),
+               '$baseurl' => ['baseurl', L10n::t('MathJax Base URL'), Config::get('mathjax','baseurl' ), L10n::t('The URL for the javascript file that should be included to use MathJax. Can be either the MathJax CDN or another installation of MathJax.')],
+       ]);
 }
index c995c54bf9281d29014b5d9b36150816a6aeec57..982a704da52007cfcdf7af2e8c6ce974a7d4b95f 100644 (file)
@@ -1,20 +1,59 @@
 <?php
-
 /**
  * Name: MemberSince
  * Description: Display membership date in profile
- * Version: 1.0
+ * Version: 1.1
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- * 
+ * Status: Unsupported
  */
 
-require_once('include/datetime.php');
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Util\DateTimeFormat;
+
+function membersince_install()
+{
+       Addon::registerHook('profile_advanced', 'addon/membersince/membersince.php', 'membersince_display');
+}
+
+function membersince_uninstall()
+{
+       Addon::unregisterHook('profile_advanced', 'addon/membersince/membersince.php', 'membersince_display');
+}
+
+function membersince_display(&$a, &$b)
+{
+       if (current_theme() == 'frio') {
+               // Works in Frio.
+               $doc = new DOMDocument();
+               $doc->loadHTML(mb_convert_encoding($b, 'HTML-ENTITIES', 'UTF-8'));
+
+               $elm = $doc->getElementById('aprofile-fullname');
+
+               $div = $doc->createElement('div');
+               $div->setAttribute('id','aprofile-membersince');
+               $div->setAttribute('class','col-lg-12 col-md-12 col-sm-12 col-xs-12 aprofile');
+
+               // The seperator line.
+               $hr = $doc->createElement('hr','');
+               $hr->setAttribute('class','profile-separator');
+
+               // The label div.
+               $label = $doc->createElement('div', L10n::t('Member since:'));
+               $label->setAttribute('class', 'col-lg-4 col-md-4 col-sm-4 col-xs-12 profile-label-name text-muted');
 
-function membersince_install(){ register_hook('profile_advanced','addon/membersince/membersince.php','membersince_display'); }
+               // The div for the register date of the profile owner.
+               $entry = $doc->createElement('div', DateTimeFormat::local($a->profile['register_date']));
+               $entry->setAttribute('class', 'col-lg-8 col-md-8 col-sm-8 col-xs-12 profile-entry');
 
-function membersince_uninstall(){ unregister_hook('profile_advanced','addon/membersince/membersince.php','membersince_display'); }
+               $div->appendChild($hr);
+               $div->appendChild($label);
+               $div->appendChild($entry);
+               $elm->parentNode->insertBefore($div, $elm->nextSibling);
 
-function membersince_display(&$a,&$b) { 
-$b = preg_replace('/<\/dl>/',"</dl>\n\n\n<dl id=\"aprofile-membersince\" class=\"aprofile\">\n<dt>" . t('Member since:') . "</dt>\n<dd>" . datetime_convert('UTC',date_default_timezone_get(),$a->profile['register_date']) . "</dd>\n</dl>" ,$b, 1); 
-//$b = str_replace('</div>' . "\n" . '<div id="advanced-profile-name-end"></div>',sprintf( t(' - Member since: %s') . EOL, datetime_convert('UTC',date_default_timezone_get(),$a->profile['register_date'])) . '</div>' . "\n" . '<div id="advanced-profile-name-end"></div>',$b); 
-}
\ No newline at end of file
+               $b = $doc->saveHTML();
+       } else {
+               // Works in Vier.
+               $b = preg_replace('/<\/dl>/', "</dl>\n\n\n<dl id=\"aprofile-membersince\" class=\"aprofile\">\n<dt>" . L10n::t('Member since:') . "</dt>\n<dd>" . DateTimeFormat::local($a->profile['register_date']) . "</dd>\n</dl>", $b, 1);
+       }
+}
index d22ec3aaf1dbfe3ab7e8e7c629e3d4303d996fb9..b8a170a1b4678cc5f1fa18ba7daeb8bb015f42af 100644 (file)
@@ -7,24 +7,24 @@
  *    - who takes no responsibility for any additional content which may appear herein
  *
  */
-
+use Friendica\Core\Addon;
 
 function morechoice_install() {
 
-       register_hook('gender_selector', 'addon/morechoice/morechoice.php', 'morechoice_gender_selector');
-       register_hook('sexpref_selector', 'addon/morechoice/morechoice.php', 'morechoice_sexpref_selector');
-       register_hook('marital_selector', 'addon/morechoice/morechoice.php', 'morechoice_marital_selector');
+       Addon::registerHook('gender_selector', 'addon/morechoice/morechoice.php', 'morechoice_gender_selector');
+       Addon::registerHook('sexpref_selector', 'addon/morechoice/morechoice.php', 'morechoice_sexpref_selector');
+       Addon::registerHook('marital_selector', 'addon/morechoice/morechoice.php', 'morechoice_marital_selector');
 }
 
 
 function morechoice_uninstall() {
 
-       unregister_hook('gender_selector', 'addon/morechoice/morechoice.php', 'morechoice_gender_selector');
-       unregister_hook('sexpref_selector', 'addon/morechoice/morechoice.php', 'morechoice_sexpref_selector');
-       unregister_hook('marital_selector', 'addon/morechoice/morechoice.php', 'morechoice_marital_selector');
+       Addon::unregisterHook('gender_selector', 'addon/morechoice/morechoice.php', 'morechoice_gender_selector');
+       Addon::unregisterHook('sexpref_selector', 'addon/morechoice/morechoice.php', 'morechoice_sexpref_selector');
+       Addon::unregisterHook('marital_selector', 'addon/morechoice/morechoice.php', 'morechoice_marital_selector');
 
 // We need to leave this here for a while, because we now have a situation where people can end up with an orphaned hook.
-       unregister_hook('poke_verbs', 'addon/morechoice/morechoice.php', 'morechoice_poke_verbs');
+       Addon::unregisterHook('poke_verbs', 'addon/morechoice/morechoice.php', 'morechoice_poke_verbs');
 
 }
 
index fb4f86c3e9e5b175dc2c8064bfa0550078ea1def..feb64b4a8acc9a7c2234ffd893ef5523c63afea3 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:20+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index 717643ec11f2366e50c1eb9317177948aac3939d..e0caaa5221c5a1435394d7c6c80e9f07a27bfa33 100644 (file)
@@ -6,32 +6,37 @@
  * Author: Thomas Willingham <https://kakste.com/profile/beardyunixer>
  *
  */
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
 
-function morepokes_install() {
-         register_hook('poke_verbs', 'addon/morepokes/morepokes.php', 'morepokes_poke_verbs');
+function morepokes_install()
+{
+         Addon::registerHook('poke_verbs', 'addon/morepokes/morepokes.php', 'morepokes_poke_verbs');
 }
 
-function morepokes_uninstall() {
-         unregister_hook('poke_verbs', 'addon/morepokes/morepokes.php', 'morepokes_poke_verbs');
+function morepokes_uninstall()
+{
+         Addon::unregisterHook('poke_verbs', 'addon/morepokes/morepokes.php', 'morepokes_poke_verbs');
 }
 
-function morepokes_poke_verbs($a,&$b) {
-       $b['bitchslap'] = array('bitchslapped', t('bitchslap'), t('bitchslapped'));
-       $b['shag'] = array('shag', t('shag'), t('shagged'));
-       $b['somethingobscenelybiological'] = array('something obscenely biological', t('do something obscenely biological to'), t('did something obscenely biological to'));
-       $b['newpokefeature'] = array('pointed out the poke feature to', t('point out the poke feature to'), t('pointed out the poke feature to'));
-       $b['declareundyinglove'] = array('declared undying love for', t('declare undying love for'), t('declared undying love for'));
-       $b['patent'] = array('patented', t('patent'), t('patented'));
-       $b['strokebeard'] = array('stroked their beard at', t('stroke beard'), t('stroked their beard at'));
-       $b['bemoan'] = array('bemoaned the declining standards of modern secondary and tertiary education to', t('bemoan the declining standards of modern secondary and tertiary education to'), t('bemoans the declining standards of modern secondary and tertiary education to'));
-       $b['hugs'] = array('hugged', t('hug'), t('hugged'));
-       $b['kiss'] = array('kissed', t('kiss'), t('kissed'));
-       $b['raiseeyebrows'] = array('raised their eyebrows at', t('raise eyebrows at'), t('raised their eyebrows at'));
-       $b['insult'] = array('insulted', t('insult'), t('insulted'));
-       $b['praise'] = array('praised', t('praise'), t('praised'));
-       $b['bedubiousof'] = array('was dubious of', t('be dubious of'), t('was dubious of'));
-       $b['eat'] = array('ate', t('eat'), t('ate'));
-       $b['giggleandfawn'] = array('giggled and fawned at', t('giggle and fawn at'), t('giggled and fawned at'));
-       $b['doubt'] = array('doubted', t('doubt'), t('doubted'));
-       $b['glare'] = array('glared at', t('glare'), t('glared at'));
-;}
+function morepokes_poke_verbs($a, &$b)
+{
+       $b['bitchslap'] = ['bitchslapped', L10n::t('bitchslap'), L10n::t('bitchslapped')];
+       $b['shag'] = ['shag', L10n::t('shag'), L10n::t('shagged')];
+       $b['somethingobscenelybiological'] = ['something obscenely biological', L10n::t('do something obscenely biological to'), L10n::t('did something obscenely biological to')];
+       $b['newpokefeature'] = ['pointed out the poke feature to', L10n::t('point out the poke feature to'), L10n::t('pointed out the poke feature to')];
+       $b['declareundyinglove'] = ['declared undying love for', L10n::t('declare undying love for'), L10n::t('declared undying love for')];
+       $b['patent'] = ['patented', L10n::t('patent'), L10n::t('patented')];
+       $b['strokebeard'] = ['stroked their beard at', L10n::t('stroke beard'), L10n::t('stroked their beard at')];
+       $b['bemoan'] = ['bemoaned the declining standards of modern secondary and tertiary education to', L10n::t('bemoan the declining standards of modern secondary and tertiary education to'), L10n::t('bemoans the declining standards of modern secondary and tertiary education to')];
+       $b['hugs'] = ['hugged', L10n::t('hug'), L10n::t('hugged')];
+       $b['kiss'] = ['kissed', L10n::t('kiss'), L10n::t('kissed')];
+       $b['raiseeyebrows'] = ['raised their eyebrows at', L10n::t('raise eyebrows at'), L10n::t('raised their eyebrows at')];
+       $b['insult'] = ['insulted', L10n::t('insult'), L10n::t('insulted')];
+       $b['praise'] = ['praised', L10n::t('praise'), L10n::t('praised')];
+       $b['bedubiousof'] = ['was dubious of', L10n::t('be dubious of'), L10n::t('was dubious of')];
+       $b['eat'] = ['ate', L10n::t('eat'), L10n::t('ate')];
+       $b['giggleandfawn'] = ['giggled and fawned at', L10n::t('giggle and fawn at'), L10n::t('giggled and fawned at')];
+       $b['doubt'] = ['doubted', L10n::t('doubt'), L10n::t('doubted')];
+       $b['glare'] = ['glared at', L10n::t('glare'), L10n::t('glared at')];
+}
index 0ccf106c0c265bec55bf72efe05129928a68c31c..c758fc08af3408edc57b5dc449845b1b01d9b134 100644 (file)
@@ -1,20 +1,20 @@
 <?php
-
 /**
  *
  * Name: NameThingy
  * Description: The Ultimate Random Name Generator
  * Version: 1.0
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
+ * Status: Unsupported
  */
-
+use Friendica\Core\Addon;
 
 function namethingy_install() {
-    register_hook('app_menu', 'addon/namethingy/namethingy.php', 'namethingy_app_menu');
+    Addon::registerHook('app_menu', 'addon/namethingy/namethingy.php', 'namethingy_app_menu');
 }
 
 function namethingy_uninstall() {
-    unregister_hook('app_menu', 'addon/namethingy/namethingy.php', 'namethingy_app_menu');
+    Addon::unregisterHook('app_menu', 'addon/namethingy/namethingy.php', 'namethingy_app_menu');
 
 }
 
index f0a8c14f7ac554c8eb0c918e4032f1ff9577e664..b62a779b49a9bd0f879c2637c23ae5a3c798402d 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-06-01 14:12+0200\n"
-"PO-Revision-Date: 2014-09-10 14:12+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index d837efc24d8b98902df88f4964e598f138f3807d..57b49230c1a60fbed7be7396b2095456eaee74c3 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /***
  * Name: New Member Widget
  * Description: Adds a widget for new members into the sidebar of the network page. The widget will be displayed for the 1st 14days of a account existance and contains a link to the new member page and a free-form text the admin can define.
@@ -7,52 +6,56 @@
  * Author: Tobias Diekershoff <https://f.diekershoff.de/profile/tobias>
  ***/
 
-require_once('include/bbcode.php');
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
 
 function newmemberwidget_install () {
-    register_hook( 'network_mod_init', 'addon/newmemberwidget/newmemberwidget.php', 'newmemberwidget_network_mod_init');
+    Addon::registerHook( 'network_mod_init', 'addon/newmemberwidget/newmemberwidget.php', 'newmemberwidget_network_mod_init');
     logger('newmemberwidget installed');
 }
 function newmemberwidget_uninstall () {
-    unregister_hook( 'network_mod_init', 'addon/newmemberwidget/newmemberwidget.php', 'newmemberwidget_network_mod_init');
+    Addon::unregisterHook( 'network_mod_init', 'addon/newmemberwidget/newmemberwidget.php', 'newmemberwidget_network_mod_init');
 }
 
 function newmemberwidget_network_mod_init ( $a, $b) {
     if (x($_SESSION['new_member'])) {
        $t = '<div id="newmember_widget" class="widget">'.EOL;
-       $t .= '<h3>'.t('New Member').'</h3>'.EOL;
-       $t .= '<a href="newmember" id="newmemberwidget-tips">' . t('Tips for New Members') . '</a><br />'.EOL;
-       if (get_config('newmemberwidget','linkglobalsupport')==1)
-           $t .= '<a href="https://forum.friendi.ca/profile/helpers" target="_new">'.t('Global Support Forum').'</a><br />'.EOL;
-       if (get_config('newmemberwidget','linklocalsupport')==1)
-           $t .= '<a href="'.$a->get_baseurl().'/profile/'.get_config('newmemberwidget','localsupport').'" target="_new">'.t('Local Support Forum').'</a><br />'.EOL;
-       $ft = get_config('newmemberwidget','freetext');
+       $t .= '<h3>'.L10n::t('New Member').'</h3>'.EOL;
+       $t .= '<a href="newmember" id="newmemberwidget-tips">' . L10n::t('Tips for New Members') . '</a><br />'.EOL;
+       if (Config::get('newmemberwidget','linkglobalsupport')==1)
+           $t .= '<a href="https://forum.friendi.ca/profile/helpers" target="_new">'.L10n::t('Global Support Forum').'</a><br />'.EOL;
+       if (Config::get('newmemberwidget','linklocalsupport')==1)
+           $t .= '<a href="'.$a->get_baseurl().'/profile/'.Config::get('newmemberwidget','localsupport').'" target="_new">'.L10n::t('Local Support Forum').'</a><br />'.EOL;
+       $ft = Config::get('newmemberwidget','freetext');
        if (!trim($ft)=="")
-           $t .= '<p>'.bbcode(trim($ft)).'</p>';
+           $t .= '<p>'.BBCode::convert(trim($ft)).'</p>';
        $t .= '</div><div class="clear"></div>';
        $a->page['aside'] = $t . $a->page['aside'];
     }
 }
 
-function newmemberwidget_plugin_admin_post( &$a ) {
-    $ft = ((x($_POST, 'freetext')) ? trim($_POST['freetext']) : "");
-    $lsn = ((x($_POST, 'localsupportname')) ? notags(trim($_POST['localsupportname'])) : "");
-    $gs = intval($_POST['linkglobalsupport']);
-    $ls = intval($_POST['linklocalsupport']);
-    set_config ( 'newmemberwidget', 'freetext',           trim($ft));
-    set_config ( 'newmemberwidget', 'linkglobalsupport',  $gs);
-    set_config ( 'newmemberwidget', 'linklocalsupport',   $ls);
-    set_config ( 'newmemberwidget', 'localsupport',       trim($lsn));
+function newmemberwidget_addon_admin_post(&$a)
+{
+       $ft = ((x($_POST, 'freetext')) ? trim($_POST['freetext']) : "");
+       $lsn = ((x($_POST, 'localsupportname')) ? notags(trim($_POST['localsupportname'])) : "");
+       $gs = intval($_POST['linkglobalsupport']);
+       $ls = intval($_POST['linklocalsupport']);
+       Config::set('newmemberwidget', 'freetext',           trim($ft));
+       Config::set('newmemberwidget', 'linkglobalsupport',  $gs);
+       Config::set('newmemberwidget', 'linklocalsupport',   $ls);
+       Config::set('newmemberwidget', 'localsupport',       trim($lsn));
 }
 
-function newmemberwidget_plugin_admin(&$a, &$o){
-    $t = get_markup_template('admin.tpl','addon/newmemberwidget');
-    $o = replace_macros($t, array(
-       '$submit' => t('Save Settings'),
-       '$freetext' => array( "freetext", t("Message"), get_config( "newmemberwidget", "freetext" ), t("Your message for new members. You can use bbcode here.")),
-       '$linkglobalsupport' => array( "linkglobalsupport", t('Add a link to global support forum'), get_config( 'newmemberwidget', 'linkglobalsupport'), t('Should a link to the global support forum be displayed?')." (<a href='https://forum.friendi.ca/profile/helpers'>@helpers</a>)"),
-       '$linklocalsupport' => array( "linklocalsupport", t('Add a link to the local support forum'), get_config( 'newmemberwidget', 'linklocalsupport'), t('If you have a local support forum and want to have a link displayed in the widget, check this box.')),
-       '$localsupportname' => array( "localsupportname", t('Name of the local support group'), get_config( 'newmemberwidget', 'localsupport'), t('If you checked the above, specify the <em>nickname</em> of the local support group here (i.e. helpers)')),
-    ));
+function newmemberwidget_addon_admin(&$a, &$o)
+{
+       $t = get_markup_template('admin.tpl', 'addon/newmemberwidget');
+       $o = replace_macros($t, [
+       '$submit' => L10n::t('Save Settings'),
+       '$freetext' => [ "freetext", L10n::t("Message"), Config::get("newmemberwidget", "freetext"), L10n::t("Your message for new members. You can use bbcode here.")],
+       '$linkglobalsupport' => [ "linkglobalsupport", L10n::t('Add a link to global support forum'), Config::get('newmemberwidget', 'linkglobalsupport'), L10n::t('Should a link to the global support forum be displayed?')." (<a href='https://forum.friendi.ca/profile/helpers'>@helpers</a>)"],
+       '$linklocalsupport' => [ "linklocalsupport", L10n::t('Add a link to the local support forum'), Config::get('newmemberwidget', 'linklocalsupport'), L10n::t('If you have a local support forum and want to have a link displayed in the widget, check this box.')],
+       '$localsupportname' => [ "localsupportname", L10n::t('Name of the local support group'), Config::get('newmemberwidget', 'localsupport'), L10n::t('If you checked the above, specify the <em>nickname</em> of the local support group here (i.e. helpers)')],
+       ]);
 }
-
index 3f2cdc890ab0fa6f565a587996f026d7c9d934ea..c49128319f3ce102340e7316bbe514efafd315b4 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  *
  * Name: Notifyall
@@ -9,7 +8,9 @@
  * Author: Rabuzarus <https://friendica.kommune4.de/profile/rabuzarus> (Port to Friendica)
  */
 
-require_once('include/Emailer.php');
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\L10n;
+use Friendica\Util\Emailer;
 
 function notifyall_install() {
        logger("installed notifyall");
@@ -21,10 +22,9 @@ function notifyall_uninstall() {
 
 function notifyall_module() {}
 
-function notifyall_plugin_admin(&$a, &$o) {
-
-       $o = '<div></div>&nbsp;&nbsp;&nbsp;&nbsp;<a href="' . z_root() . '/notifyall">' . t('Send email to all members') . '</a></br/>';
+function notifyall_addon_admin(&$a, &$o) {
 
+       $o = '<div></div>&nbsp;&nbsp;&nbsp;&nbsp;<a href="' . z_root() . '/notifyall">' . L10n::t('Send email to all members') . '</a></br/>';
 }
 
 
@@ -39,10 +39,10 @@ function notifyall_post(&$a) {
        $sitename = $a->config['sitename'];
 
        if (!x($a->config['admin_name']))
-               $sender_name = sprintf(t('%s Administrator'), $sitename);
+               $sender_name = L10n::t('%s Administrator', $sitename);
        else
-               $sender_name = sprintf(t('%1$s, %2$s Administrator'), $a->config['admin_name'], $sitename);
-       
+               $sender_name = L10n::t('%1$s, %2$s Administrator', $a->config['admin_name'], $sitename);
+
        if (! x($a->config['sender_email']))
                $sender_email = 'noreply@' . $a->get_hostname();
        else
@@ -51,13 +51,15 @@ function notifyall_post(&$a) {
        $subject = $_REQUEST['subject'];
 
 
-       $textversion = strip_tags(html_entity_decode(bbcode(stripslashes(str_replace(array("\\r", "\\n"),array( "", "\n"), $text))),ENT_QUOTES,'UTF-8'));
+       $textversion = strip_tags(html_entity_decode(BBCode::convert(stripslashes(str_replace(["\\r", "\\n"], ["", "\n"], $text))), ENT_QUOTES, 'UTF-8'));
+
+       $htmlversion = BBCode::convert(stripslashes(str_replace(["\\r", "\\n"], ["", "<br />\n"], $text)));
 
        $htmlversion = bbcode(stripslashes(str_replace(array("\\r","\\n"), array("","<br />\n"),$text)));
        
        // if this is a test, send it only to the admin(s)
        // admin_email might be a comma separated list, but we need "a@b','c@d','e@f
-       if ( intval($_REQUEST['test'])) {
+       if (intval($_REQUEST['test'])) {
                $email = $a->config['admin_email'];
                $email = "'" . str_replace(array(" ",","), array("","','"), $email) . "'";
        }
@@ -65,15 +67,13 @@ function notifyall_post(&$a) {
 
        $recips = q("SELECT DISTINCT `email` FROM `user` WHERE `verified` AND NOT `account_removed` AND NOT `account_expired` $sql_extra");
 
-       if(! $recips) {
-               notice( t('No recipients found.') . EOL);
+       if (! $recips) {
+               notice(L10n::t('No recipients found.') . EOL);
                return;
        }
 
-       foreach($recips as $recip) {
-
-
-               Emailer::send(array(
+       foreach ($recips as $recip) {
+               Emailer::send([
                        'fromName'             => $sender_name,
                        'fromEmail'            => $sender_email,
                        'replyTo'              => $sender_email,
@@ -84,24 +84,25 @@ function notifyall_post(&$a) {
                ));
        }
 
-       notice( t('Emails sent'));
+       notice(L10n::t('Emails sent'));
        goaway('admin');
 }
 
-function notifyall_content(&$a) {
-       if(! is_site_admin())
+function notifyall_content(&$a)
+{
+       if (! is_site_admin()) {
                return;
+       }
 
-       $title = t('Send email to all members of this Friendica instance.');
+       $title = L10n::t('Send email to all members of this Friendica instance.');
 
-       $o = replace_macros(get_markup_template('notifyall_form.tpl','addon/notifyall/'),array(
+       $o = replace_macros(get_markup_template('notifyall_form.tpl', 'addon/notifyall/'), [
                '$title' => $title,
                '$text' => htmlspecialchars($_REQUEST['text']),
-               '$subject' => array('subject',t('Message subject'),$_REQUEST['subject'],''),
-               '$test' => array('test',t('Test mode (only send to administrator)'), 0,''),
-               '$submit' => t('Submit')
-       ));
+               '$subject' => ['subject',L10n::t('Message subject'),$_REQUEST['subject'],''],
+               '$test' => ['test',L10n::t('Test mode (only send to administrator)'), 0,''],
+               '$submit' => L10n::t('Submit')
+       ]);
 
        return $o;
-
 }
index 5c50b5eba616558755e6cf121eabd76b08ecb388..c42ec252779cee4e7f928819424f2012ac3ead89 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:21+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index c2bca211beb398479e7c36c23f514c858d81011e..fb32717965c2ed79453014694c9b9c0d756c3087 100644 (file)
@@ -4,32 +4,32 @@
  * Description: Disable "Archives" widget on profile page
  * Version: 1.0
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- * 
  *
  */
-
-
-function notimeline_install() {
-
-       register_hook('plugin_settings', 'addon/notimeline/notimeline.php', 'notimeline_settings');
-       register_hook('plugin_settings_post', 'addon/notimeline/notimeline.php', 'notimeline_settings_post');
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+
+function notimeline_install()
+{
+       Addon::registerHook('addon_settings', 'addon/notimeline/notimeline.php', 'notimeline_settings');
+       Addon::registerHook('addon_settings_post', 'addon/notimeline/notimeline.php', 'notimeline_settings_post');
 }
 
-
-function notimeline_uninstall() {
-       unregister_hook('plugin_settings', 'addon/notimeline/notimeline.php', 'notimeline_settings');
-       unregister_hook('plugin_settings_post', 'addon/notimeline/notimeline.php', 'notimeline_settings_post');
-
+function notimeline_uninstall()
+{
+       Addon::unregisterHook('addon_settings', 'addon/notimeline/notimeline.php', 'notimeline_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/notimeline/notimeline.php', 'notimeline_settings_post');
 }
 
-
-function notimeline_settings_post($a,$post) {
-       if(! local_user() || (! x($_POST,'notimeline-submit')))
+function notimeline_settings_post($a, $post)
+{
+       if (!local_user() || (!x($_POST, 'notimeline-submit'))) {
                return;
+       }
 
-       set_pconfig(local_user(),'system','no_wall_archive_widget',intval($_POST['notimeline']));
-       info( t('No Timeline settings updated.') . EOL);
+       PConfig::set(local_user(), 'system', 'no_wall_archive_widget', intval($_POST['notimeline']));
+       info(L10n::t('No Timeline settings updated.') . EOL);
 }
 
 function notimeline_settings(&$a,&$s) {
@@ -53,14 +53,13 @@ function notimeline_settings(&$a,&$s) {
        /* Add some HTML to the existing form */
 
        $s .= '<div class="settings-block">';
-       $s .= '<h3>' . t('No Timeline Settings') . '</h3>';
+       $s .= '<h3>' . L10n::t('No Timeline Settings') . '</h3>';
        $s .= '<div id="notimeline-wrapper">';
-       $s .= '<label id="notimeline-label" for="notimeline-checkbox">' . t('Disable Archive selector on profile wall') . '</label>';
+       $s .= '<label id="notimeline-label" for="notimeline-checkbox">' . L10n::t('Disable Archive selector on profile wall') . '</label>';
        $s .= '<input id="notimeline-checkbox" type="checkbox" name="notimeline" value="1" ' . $notimeline_checked . '/>';
        $s .= '</div><div class="clear"></div>';
 
        /* provide a submit button */
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="notimeline-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
-
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="notimeline-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 }
index cf2dc2623384c9e434c3d0b739c7ccf7dd1679d5..e4a8b9d3188a0eef11fd71c4fce0b0a754580691 100644 (file)
@@ -6,3 +6,92 @@ Scans the message content for the string 'nsfw'
 (case insensitive) and if found replaces the content
 with a "click to open/close" link, default is closed.
 
+If you click on the 'Not safe for work' addon under
+/settings/addon a text field appears, where you can
+extend the list of search terms. The terms must be
+seperated by commas.
+
+It is also possible to enter profile URLs as values.
+This is quite useful for the case, that you perhaps
+don't want to see postings by person_A, but person_B
+is one of your contacts and person_B used to reshare
+postings by person_A.
+
+You can also make use of regular expressions.
+They also have to be seperated by commas and the
+regex itself has to be enclosed with slashes:
+
+       ... nsfw, /<REGEX>/, politics,...
+
+---------------
+A few examples:
+---------------
+
+1)
+Let's say you don't want to see postings which contain
+the term 'fake news'
+
+The term could appear in several ways:
+
+fakenews, fake news, fake_news, fake-news, f@ke news,
+f4ke news, f4k3 n3ws, and so on and so on and so on.
+
+You could write every possible version of it as single
+item into your NSFW-filter list, but this can also be
+done with a single regex, which matches all of them:
+
+       /f[@4a]k[3e][-_ ]n[3e]w[sz]/
+
+
+2)
+Another use case could be, that you are simply not
+interested in postings about christmas.
+
+       /christmas(?:[-_ ]?(?:tree|time|eve|pudding))?/
+
+
+ATTENTION:
+
+It is absolutely important, that you use grouping
+parentheses instead of capturing parentheses!!
+
+Grouping parentheses are:
+
+       (?: )
+
+If you use capturing parentheses, which are
+
+       ( )
+
+it will produce errors and the regex won't work and
+at least your targets will not get collapsed.
+
+
+
+3)
+Another possibility is the usage of a so called
+'lookbehind' construct. I'll give an example followed
+by a descripton:
+
+       /(?<!the )\badvent\b/
+
+The \b is a word boundary, what matches the beginning
+and the end of a word. The simple pattern of 'advent'
+would match advent iteself, but also adventure.
+This can be prevented by
+
+       /\badvent\b/
+
+The first part of the regex above
+
+       (?<!the )
+
+is a negative lookbehind. It makes \badvent\b only
+match, if there is no 'the ' before \badvent\b or in
+words:
+
+It looks for 'advent', but doesn't match 'the advent'.
+
+
+For more informations take a look at the PCRE regex
+dialect.
index 34ad6565f061102f7e6c25c71df6f77a4244a971..96e2849c52f92808533689da965c0e2f22ab899e 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
+"POT-Creation-Date: 2018-03-15 17:54+0700\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,41 +17,39 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: nsfw.php:78
-msgid "Not Safe For Work (General Purpose Content Filter) settings"
+#: nsfw.php:77 nsfw.php:81
+msgid "Content Filter (NSFW and more)"
 msgstr ""
 
-#: nsfw.php:80
+#: nsfw.php:85
 msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
-"collapses any content containing those keywords so it is not displayed at "
-"inappropriate times, such as sexual innuendo that may be improper in a work "
-"setting. It is polite and recommended to tag any content containing nudity "
-"with #NSFW.  This filter can also match any other word/text you specify, and "
-"can thereby be used as a general purpose content filter."
+"This addon searches for specified words/text in posts and collapses them. It "
+"can be used to filter content tagged with for instance #NSFW that may be "
+"deemed inappropriate at certain times or places, such as being at work. It "
+"is also useful for hiding irrelevant or annoying content from direct view."
 msgstr ""
 
-#: nsfw.php:81
+#: nsfw.php:86
 msgid "Enable Content filter"
 msgstr ""
 
-#: nsfw.php:84
+#: nsfw.php:89
 msgid "Comma separated list of keywords to hide"
 msgstr ""
 
-#: nsfw.php:88
-msgid "Submit"
+#: nsfw.php:93
+msgid "Save Settings"
 msgstr ""
 
-#: nsfw.php:89
+#: nsfw.php:94
 msgid "Use /expression/ to provide regular expressions"
 msgstr ""
 
-#: nsfw.php:105
+#: nsfw.php:109
 msgid "NSFW Settings saved."
 msgstr ""
 
-#: nsfw.php:157
+#: nsfw.php:167
 #, php-format
 msgid "%s - Click to open/close"
 msgstr ""
index 36607e47eec0c528e496477d8247f44097972864..349ffefd936a7b71729fa766c30c7abee25f5dca 100644 (file)
@@ -1,7 +1,7 @@
 <?php\r
 \r
 $a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Ajustos, Not Safe For Work (Filtre de Contingut de Propòsit General)";\r
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Aquest plugin es veu en enviaments amb les paraules/text que s'especifiquen a continuació , i amagarà qualsevol contingut que contingui les paraules clau de manera que no apareguin en moments inapropiats, com ara insinuacions sexuals que poden ser inadequades en un entorn de treball. És de bona educació i es recomana etiquetar qualsevol contingut que contingui nus amb #NSFW. Aquest filtre també es pot fer coincidir amb qualsevol paraula/text que especifiqueu, i per tant pot ser utilitzat com un filtre general de contingut.";\r
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Aquest addon es veu en enviaments amb les paraules/text que s'especifiquen a continuació , i amagarà qualsevol contingut que contingui les paraules clau de manera que no apareguin en moments inapropiats, com ara insinuacions sexuals que poden ser inadequades en un entorn de treball. És de bona educació i es recomana etiquetar qualsevol contingut que contingui nus amb #NSFW. Aquest filtre també es pot fer coincidir amb qualsevol paraula/text que especifiqueu, i per tant pot ser utilitzat com un filtre general de contingut.";\r
 $a->strings["Enable Content filter"] = "Activat el filtre de Contingut";\r
 $a->strings["Comma separated list of keywords to hide"] = "Llista separada per comes de paraules clau per ocultar";\r
 $a->strings["Submit"] = "Enviar";\r
index da5142ba4b493d1f917c5181198a7c9b04555358..61d367c4df553ccca9d8961c7c51e988f932507a 100644 (file)
@@ -25,13 +25,13 @@ msgstr "Not Safe For Work (General Purpose Content Filter) nastavení"
 
 #: nsfw.php:80
 msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
+"This addon looks in posts for the words/text you specify below, and "
 "collapses any content containing those keywords so it is not displayed at "
 "inappropriate times, such as sexual innuendo that may be improper in a work "
 "setting. It is polite and recommended to tag any content containing nudity "
 "with #NSFW.  This filter can also match any other word/text you specify, and"
 " can thereby be used as a general purpose content filter."
-msgstr "Tento plugin hledá v příspěvcích slova zadáná níže a skryje jakýkoliv obsah, který tyto slova obsahuje v prostředích, kde to není vhodné. Je slušné a doporučené jakékoliv příspěvky s mahotou označit s #NSFW.  Tento filtr může také vyhledávat jakékoliv Vámi specifikované slovní spojení, takže může být využit jako obecný kontextový filtr."
+msgstr "Tento addon hledá v příspěvcích slova zadáná níže a skryje jakýkoliv obsah, který tyto slova obsahuje v prostředích, kde to není vhodné. Je slušné a doporučené jakékoliv příspěvky s mahotou označit s #NSFW.  Tento filtr může také vyhledávat jakékoliv Vámi specifikované slovní spojení, takže může být využit jako obecný kontextový filtr."
 
 #: nsfw.php:81
 msgid "Enable Content filter"
index 9731449582fd0b18598b82915019f36d96ab2f8d..fd07368bd2fc0ea00855241cae86eb826d881132 100644 (file)
@@ -6,7 +6,7 @@ function string_plural_select_cs($n){
 }}
 ;
 $a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Not Safe For Work (General Purpose Content Filter) nastavení";
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Tento plugin hledá v příspěvcích slova zadáná níže a skryje jakýkoliv obsah, který tyto slova obsahuje v prostředích, kde to není vhodné. Je slušné a doporučené jakékoliv příspěvky s mahotou označit s #NSFW.  Tento filtr může také vyhledávat jakékoliv Vámi specifikované slovní spojení, takže může být využit jako obecný kontextový filtr.";
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Tento addon hledá v příspěvcích slova zadáná níže a skryje jakýkoliv obsah, který tyto slova obsahuje v prostředích, kde to není vhodné. Je slušné a doporučené jakékoliv příspěvky s mahotou označit s #NSFW.  Tento filtr může také vyhledávat jakékoliv Vámi specifikované slovní spojení, takže může být využit jako obecný kontextový filtr.";
 $a->strings["Enable Content filter"] = "Povolit Kontextový filtr";
 $a->strings["Comma separated list of keywords to hide"] = "Čárkou oddělený seznam klíčových slov ke skrytí";
 $a->strings["Submit"] = "Odeslat";
index 1355f8aba42d38506c7839aaf1945bce9c6242d5..b691b609f13d01d91c00e8185159f4a14bc9a752 100644 (file)
@@ -4,57 +4,56 @@
 # 
 # 
 # Translators:
-# Abrax <webmaster@a-zwenkau.de>, 2014
-# bavatar <tobias.diekershoff@gmx.net>, 2014
+# Andreas H., 2014
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2014
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-10-15 12:32+0000\n"
-"Last-Translator: Abrax <webmaster@a-zwenkau.de>\n"
-"Language-Team: German (http://www.transifex.com/projects/p/friendica/language/de/)\n"
+"POT-Creation-Date: 2018-03-15 17:54+0700\n"
+"PO-Revision-Date: 2018-03-16 19:59+0000\n"
+"Last-Translator: Tobias Diekershoff <tobias.diekershoff@gmx.net>\n"
+"Language-Team: German (http://www.transifex.com/Friendica/friendica/language/de/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: de\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: nsfw.php:78
-msgid "Not Safe For Work (General Purpose Content Filter) settings"
-msgstr "Not Safe for Work (Filter für ungewollte Inhalte) Einstellungen:"
+#: nsfw.php:77 nsfw.php:81
+msgid "Content Filter (NSFW and more)"
+msgstr "Inhaltsfilter (NSFW und mehr)"
 
-#: nsfw.php:80
+#: nsfw.php:85
 msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
-"collapses any content containing those keywords so it is not displayed at "
-"inappropriate times, such as sexual innuendo that may be improper in a work "
-"setting. It is polite and recommended to tag any content containing nudity "
-"with #NSFW.  This filter can also match any other word/text you specify, and"
-" can thereby be used as a general purpose content filter."
-msgstr "Dieses Plugin sucht in Beiträgen nach Wörtern oder Textbauteilen die du weiter unten eingibst, findet es diese Bausteine, dann wird der entsprechende Beitrag zusammengefaltet dargestellt. Auf diese Weise wird verhindert, dass Inhalte, wie z.B. sexuelle Anspielungen, in unpassenden Momenten angezeigt werden. Du solltest den #NSFW Tag für Beiträge verwenden von denen du ausgehen kannst, dass andere sie anstößig finden könnten. Su kannst beliebige Wörter in der Filterliste angeben und ihn so als allgemeinen Filter verwenden."
-
-#: nsfw.php:81
+"This addon searches for specified words/text in posts and collapses them. It"
+" can be used to filter content tagged with for instance #NSFW that may be "
+"deemed inappropriate at certain times or places, such as being at work. It "
+"is also useful for hiding irrelevant or annoying content from direct view."
+msgstr "Dieses Addon sucht nach von dir definierten Wörtern bzw. Texten in Beiträgen und kollabiert diese wenn die Wörter gefunden werden. Damit können z.B. Inhalte gefiltert werden, die mit #NSFW (nicht für die Arbeit geeignet) gekennzeichnet sind. Außerdem ist es nützlich um irrelevante oder lästige Inhalte zu verbergen."
+
+#: nsfw.php:86
 msgid "Enable Content filter"
 msgstr "Aktiviere den Inhaltsfilter"
 
-#: nsfw.php:84
+#: nsfw.php:89
 msgid "Comma separated list of keywords to hide"
 msgstr "Durch Kommata getrennte Liste von Schlüsselwörtern die verborgen werden sollen"
 
-#: nsfw.php:88
-msgid "Submit"
-msgstr "Senden"
+#: nsfw.php:93
+msgid "Save Settings"
+msgstr "Einstellungen speichern"
 
-#: nsfw.php:89
+#: nsfw.php:94
 msgid "Use /expression/ to provide regular expressions"
 msgstr "Verwende /expression/ um Reguläre Ausdrücke zu verwenden"
 
-#: nsfw.php:105
+#: nsfw.php:109
 msgid "NSFW Settings saved."
 msgstr "NSFW-Einstellungen gespeichert"
 
-#: nsfw.php:157
+#: nsfw.php:167
 #, php-format
 msgid "%s - Click to open/close"
 msgstr "%s – Zum Öffnen/Schließen klicken"
index 36e258fabe29e2384b5a888549756b371a4e2bab..4a579fee64759fe2cc468bd94fa58d8fe5784aac 100644 (file)
@@ -5,11 +5,11 @@ function string_plural_select_de($n){
        return ($n != 1);;
 }}
 ;
-$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Not Safe for Work (Filter für ungewollte Inhalte) Einstellungen:";
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Dieses Plugin sucht in Beiträgen nach Wörtern oder Textbauteilen die du weiter unten eingibst, findet es diese Bausteine, dann wird der entsprechende Beitrag zusammengefaltet dargestellt. Auf diese Weise wird verhindert, dass Inhalte, wie z.B. sexuelle Anspielungen, in unpassenden Momenten angezeigt werden. Du solltest den #NSFW Tag für Beiträge verwenden von denen du ausgehen kannst, dass andere sie anstößig finden könnten. Su kannst beliebige Wörter in der Filterliste angeben und ihn so als allgemeinen Filter verwenden.";
+$a->strings["Content Filter (NSFW and more)"] = "Inhaltsfilter (NSFW und mehr)";
+$a->strings["This addon searches for specified words/text in posts and collapses them. It can be used to filter content tagged with for instance #NSFW that may be deemed inappropriate at certain times or places, such as being at work. It is also useful for hiding irrelevant or annoying content from direct view."] = "Dieses Addon sucht nach von dir definierten Wörtern bzw. Texten in Beiträgen und kollabiert diese wenn die Wörter gefunden werden. Damit können z.B. Inhalte gefiltert werden, die mit #NSFW (nicht für die Arbeit geeignet) gekennzeichnet sind. Außerdem ist es nützlich um irrelevante oder lästige Inhalte zu verbergen.";
 $a->strings["Enable Content filter"] = "Aktiviere den Inhaltsfilter";
 $a->strings["Comma separated list of keywords to hide"] = "Durch Kommata getrennte Liste von Schlüsselwörtern die verborgen werden sollen";
-$a->strings["Submit"] = "Senden";
+$a->strings["Save Settings"] = "Einstellungen speichern";
 $a->strings["Use /expression/ to provide regular expressions"] = "Verwende /expression/ um Reguläre Ausdrücke zu verwenden";
 $a->strings["NSFW Settings saved."] = "NSFW-Einstellungen gespeichert";
 $a->strings["%s - Click to open/close"] = "%s – Zum Öffnen/Schließen klicken";
diff --git a/nsfw/lang/en-gb/messages.po b/nsfw/lang/en-gb/messages.po
new file mode 100644 (file)
index 0000000..f20ff8b
--- /dev/null
@@ -0,0 +1,57 @@
+# ADDON nsfw
+# Copyright (C)
+# This file is distributed under the same license as the Friendica nsfw addon package.
+# 
+# 
+# Translators:
+# Andy H3 <andy@hubup.pro>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-03-15 17:54+0700\n"
+"PO-Revision-Date: 2018-03-16 16:07+0000\n"
+"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
+"Language-Team: English (United Kingdom) (http://www.transifex.com/Friendica/friendica/language/en_GB/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_GB\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: nsfw.php:77 nsfw.php:81
+msgid "Content Filter (NSFW and more)"
+msgstr ""
+
+#: nsfw.php:85
+msgid ""
+"This addon searches for specified words/text in posts and collapses them. It"
+" can be used to filter content tagged with for instance #NSFW that may be "
+"deemed inappropriate at certain times or places, such as being at work. It "
+"is also useful for hiding irrelevant or annoying content from direct view."
+msgstr ""
+
+#: nsfw.php:86
+msgid "Enable Content filter"
+msgstr "Enable content filter"
+
+#: nsfw.php:89
+msgid "Comma separated list of keywords to hide"
+msgstr "Comma separated list of keywords"
+
+#: nsfw.php:93
+msgid "Save Settings"
+msgstr ""
+
+#: nsfw.php:94
+msgid "Use /expression/ to provide regular expressions"
+msgstr "Use /expression/ for regular expressions."
+
+#: nsfw.php:109
+msgid "NSFW Settings saved."
+msgstr "NSFW settings saved."
+
+#: nsfw.php:167
+#, php-format
+msgid "%s - Click to open/close"
+msgstr "%s - Reveal/hide"
diff --git a/nsfw/lang/en-gb/strings.php b/nsfw/lang/en-gb/strings.php
new file mode 100644 (file)
index 0000000..a7ace52
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+
+if(! function_exists("string_plural_select_en_gb")) {
+function string_plural_select_en_gb($n){
+       return ($n != 1);;
+}}
+;
+$a->strings["Content Filter (NSFW and more)"] = "";
+$a->strings["This addon searches for specified words/text in posts and collapses them. It can be used to filter content tagged with for instance #NSFW that may be deemed inappropriate at certain times or places, such as being at work. It is also useful for hiding irrelevant or annoying content from direct view."] = "";
+$a->strings["Enable Content filter"] = "Enable content filter";
+$a->strings["Comma separated list of keywords to hide"] = "Comma separated list of keywords";
+$a->strings["Save Settings"] = "";
+$a->strings["Use /expression/ to provide regular expressions"] = "Use /expression/ for regular expressions.";
+$a->strings["NSFW Settings saved."] = "NSFW settings saved.";
+$a->strings["%s - Click to open/close"] = "%s - Reveal/hide";
diff --git a/nsfw/lang/en-us/messages.po b/nsfw/lang/en-us/messages.po
new file mode 100644 (file)
index 0000000..237124d
--- /dev/null
@@ -0,0 +1,57 @@
+# ADDON nsfw
+# Copyright (C)
+# This file is distributed under the same license as the Friendica nsfw addon package.
+# 
+# 
+# Translators:
+# Andy H3 <andy@hubup.pro>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-03-15 17:54+0700\n"
+"PO-Revision-Date: 2018-03-16 16:07+0000\n"
+"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
+"Language-Team: English (United States) (http://www.transifex.com/Friendica/friendica/language/en_US/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: en_US\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: nsfw.php:77 nsfw.php:81
+msgid "Content Filter (NSFW and more)"
+msgstr ""
+
+#: nsfw.php:85
+msgid ""
+"This addon searches for specified words/text in posts and collapses them. It"
+" can be used to filter content tagged with for instance #NSFW that may be "
+"deemed inappropriate at certain times or places, such as being at work. It "
+"is also useful for hiding irrelevant or annoying content from direct view."
+msgstr ""
+
+#: nsfw.php:86
+msgid "Enable Content filter"
+msgstr "Enable content filter"
+
+#: nsfw.php:89
+msgid "Comma separated list of keywords to hide"
+msgstr "Comma separated list of keywords"
+
+#: nsfw.php:93
+msgid "Save Settings"
+msgstr ""
+
+#: nsfw.php:94
+msgid "Use /expression/ to provide regular expressions"
+msgstr "Use /expression/ for regular expressions."
+
+#: nsfw.php:109
+msgid "NSFW Settings saved."
+msgstr "NSFW settings saved."
+
+#: nsfw.php:167
+#, php-format
+msgid "%s - Click to open/close"
+msgstr "%s - Reveal/hide"
diff --git a/nsfw/lang/en-us/strings.php b/nsfw/lang/en-us/strings.php
new file mode 100644 (file)
index 0000000..294cbbd
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+
+if(! function_exists("string_plural_select_en_us")) {
+function string_plural_select_en_us($n){
+       return ($n != 1);;
+}}
+;
+$a->strings["Content Filter (NSFW and more)"] = "";
+$a->strings["This addon searches for specified words/text in posts and collapses them. It can be used to filter content tagged with for instance #NSFW that may be deemed inappropriate at certain times or places, such as being at work. It is also useful for hiding irrelevant or annoying content from direct view."] = "";
+$a->strings["Enable Content filter"] = "Enable content filter";
+$a->strings["Comma separated list of keywords to hide"] = "Comma separated list of keywords";
+$a->strings["Save Settings"] = "";
+$a->strings["Use /expression/ to provide regular expressions"] = "Use /expression/ for regular expressions.";
+$a->strings["NSFW Settings saved."] = "NSFW settings saved.";
+$a->strings["%s - Click to open/close"] = "%s - Reveal/hide";
index d3f39d082788ac1cb60dca0e376b47ca2cc38fd4..13da052ae99a503d1c52c334646e6643836135fa 100644 (file)
@@ -1,7 +1,7 @@
 <?php\r
 \r
 $a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Not Safe For Work (ĝenerala filtrilo por enhavoj) agordoj";\r
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Tiu kromprogramo serĉas la malsupre agordatajn vortojn en afiŝoj kaj malvidebligis ilin se ili enhavas iun vorton. Tiel, afiŝoj ne montriĝis kiuj enhavas maladekvatan enhavon, ekzemple seksumaj aferoj, kiuj ne estas adekvata, ekzemple en la laborejo. En la reto, oni kutime markas tiajn afiŝojn #NSFW - Not Safe For Work - ne adekvata por la laborejo.  La filtrilo ankaŭ serĉas ĉiujn vortojn kiujn vi agordas kaj tial funkcias kiel ĝenerala filtrilo.";\r
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Tiu kromprogramo serĉas la malsupre agordatajn vortojn en afiŝoj kaj malvidebligis ilin se ili enhavas iun vorton. Tiel, afiŝoj ne montriĝis kiuj enhavas maladekvatan enhavon, ekzemple seksumaj aferoj, kiuj ne estas adekvata, ekzemple en la laborejo. En la reto, oni kutime markas tiajn afiŝojn #NSFW - Not Safe For Work - ne adekvata por la laborejo.  La filtrilo ankaŭ serĉas ĉiujn vortojn kiujn vi agordas kaj tial funkcias kiel ĝenerala filtrilo.";\r
 $a->strings["Enable Content filter"] = "Ŝalti la filtrilo por la enhavo";\r
 $a->strings["Comma separated list of keywords to hide"] = "Perkome disigita listo da kaŝontaj ŝlosilvortoj";\r
 $a->strings["Submit"] = "Sendi";\r
index 45659825b8ac689987d38946fe31607491cf97d3..2950395f29ed4084107b475830a11612fbca7c2d 100644 (file)
@@ -25,13 +25,13 @@ msgstr "Configuración \"No apto para trabajar\" (Filtro genérico de contenido)
 
 #: nsfw.php:80
 msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
+"This addon looks in posts for the words/text you specify below, and "
 "collapses any content containing those keywords so it is not displayed at "
 "inappropriate times, such as sexual innuendo that may be improper in a work "
 "setting. It is polite and recommended to tag any content containing nudity "
 "with #NSFW.  This filter can also match any other word/text you specify, and"
 " can thereby be used as a general purpose content filter."
-msgstr "Este plugin se fija por el contenido del texto y colapsa todo tema o respuesta que contiene las palabras establecidas. Como tales pueden ser contenido sexual o de otra índole que no conviene desplegar en el trabajo o ambientes correspondientes. Es de buena educación y recomendado de identificar todo tipo de contenido explicito con #NSFW. Este filtro además puede ser usado con cualquier palabra a especificar y por lo tanto ser usado como un filtro generico de contenido."
+msgstr "Este addon se fija por el contenido del texto y colapsa todo tema o respuesta que contiene las palabras establecidas. Como tales pueden ser contenido sexual o de otra índole que no conviene desplegar en el trabajo o ambientes correspondientes. Es de buena educación y recomendado de identificar todo tipo de contenido explicito con #NSFW. Este filtro además puede ser usado con cualquier palabra a especificar y por lo tanto ser usado como un filtro generico de contenido."
 
 #: nsfw.php:81
 msgid "Enable Content filter"
index 54fb2688ffc3a3d610fb25fa7b4ca96cb6743265..75d3211df263f96a496608280c2c2f934e3f4c45 100644 (file)
@@ -6,7 +6,7 @@ function string_plural_select_es($n){
 }}
 ;
 $a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Configuración \"No apto para trabajar\" (Filtro genérico de contenido)";
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Este plugin se fija por el contenido del texto y colapsa todo tema o respuesta que contiene las palabras establecidas. Como tales pueden ser contenido sexual o de otra índole que no conviene desplegar en el trabajo o ambientes correspondientes. Es de buena educación y recomendado de identificar todo tipo de contenido explicito con #NSFW. Este filtro además puede ser usado con cualquier palabra a especificar y por lo tanto ser usado como un filtro generico de contenido.";
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Este addon se fija por el contenido del texto y colapsa todo tema o respuesta que contiene las palabras establecidas. Como tales pueden ser contenido sexual o de otra índole que no conviene desplegar en el trabajo o ambientes correspondientes. Es de buena educación y recomendado de identificar todo tipo de contenido explicito con #NSFW. Este filtro además puede ser usado con cualquier palabra a especificar y por lo tanto ser usado como un filtro generico de contenido.";
 $a->strings["Enable Content filter"] = "Habilitar filtro de contenido";
 $a->strings["Comma separated list of keywords to hide"] = "Lista de palabras claves separadas por coma para colapsar el contenido correspondiente.";
 $a->strings["Submit"] = "Enviar";
index 1bfbfdfa9ebbdcdafe3f95068fe5014ce39ce772..09086f48cb5bb9699e71a365873995c3896e12fd 100644 (file)
@@ -1,7 +1,7 @@
 <?php\r
 \r
 $a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Réglages de \"NSFW\" (filtrage de contenu)";\r
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Cette extension va parcourir les publications à la recherche des mots (ou phrases) que vous spécifierez ci-dessous, et repliera automatiquement tout contenu qui les contiendrait, afin de ne pas risquer de les afficher à un moment inopportun. Comme par exemple des messages à caractère sexuel dans un contexte professionnel. Il est globalement considéré comme correct et poli de \"tagguer\" toute publication contenant de la nudité avec #NSFW (Not Safe For Work - pas pour le boulot).    Ce filtre peut également fonctionner pour tout autre texte que vous spécifierez, et pourra ainsi être utilisé comme filtre de contenu générique.";\r
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Cette extension va parcourir les publications à la recherche des mots (ou phrases) que vous spécifierez ci-dessous, et repliera automatiquement tout contenu qui les contiendrait, afin de ne pas risquer de les afficher à un moment inopportun. Comme par exemple des messages à caractère sexuel dans un contexte professionnel. Il est globalement considéré comme correct et poli de \"tagguer\" toute publication contenant de la nudité avec #NSFW (Not Safe For Work - pas pour le boulot).    Ce filtre peut également fonctionner pour tout autre texte que vous spécifierez, et pourra ainsi être utilisé comme filtre de contenu générique.";\r
 $a->strings["Enable Content filter"] = "Activer le filtrage de contenu";\r
 $a->strings["Comma separated list of keywords to hide"] = "Liste de mots-clés - séparés par des virgules - à cacher";\r
 $a->strings["Submit"] = "Envoyer";\r
index f4bcb824695edbb25556f2d967a8ab42430a4a4c..534f19c2436f08d05b7c848511632505baecd744 100644 (file)
@@ -1,7 +1,7 @@
 <?php\r
 \r
 $a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "";\r
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";\r
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";\r
 $a->strings["Enable Content filter"] = "";\r
 $a->strings["Comma separated list of keywords to hide"] = "";\r
 $a->strings["Submit"] = "Senda inn";\r
index 934a3cae1bebd83e605eeb473860e63e0409cb71..dae2b817cbe5d4fa22938b71b2beb130764079bd 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:21+0000\n"
+"POT-Creation-Date: 2018-03-15 17:54+0700\n"
+"PO-Revision-Date: 2018-03-19 13:18+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -19,41 +19,39 @@ msgstr ""
 "Language: it\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: nsfw.php:78
-msgid "Not Safe For Work (General Purpose Content Filter) settings"
-msgstr "Impostazioni per NSWF (Filtro Contenuti Generico)"
+#: nsfw.php:77 nsfw.php:81
+msgid "Content Filter (NSFW and more)"
+msgstr "Filtro Contenuto (NSFW e altro)"
 
-#: nsfw.php:80
+#: nsfw.php:85
 msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
-"collapses any content containing those keywords so it is not displayed at "
-"inappropriate times, such as sexual innuendo that may be improper in a work "
-"setting. It is polite and recommended to tag any content containing nudity "
-"with #NSFW.  This filter can also match any other word/text you specify, and"
-" can thereby be used as a general purpose content filter."
-msgstr "Questo plugin cerca nei messagi le parole/testo che inserisci qui sotto, e collassa i messaggi che li contengono, per non mostrare contenuto inappropriato nel momento sbagliato, come contenuto a sfondo sessuale che può essere inappropriato in un ambiente di lavoro. E' educato (e consigliato) taggare i messaggi che contengono nudità con #NSFW (Not Safe For Work: Non Sicuro Per il Lavoro). Questo filtro può cercare anche qualsiasi parola che inserisci, quindi può essere usato come filtro di contenuti generico."
-
-#: nsfw.php:81
+"This addon searches for specified words/text in posts and collapses them. It"
+" can be used to filter content tagged with for instance #NSFW that may be "
+"deemed inappropriate at certain times or places, such as being at work. It "
+"is also useful for hiding irrelevant or annoying content from direct view."
+msgstr "Questo componente aggiuntivo cerca per le parole specificate nei messaggi e li collassa. Può essere usato per filtrare contenuto taggato, per esempio, #NSFW (non sicuro per il lavoro), che puo' risultare inappropriato in certi orari o in certi luoghi, come appunto al lavoro. È anche utile per nascondere contenuto irrilevante o fastidioso."
+
+#: nsfw.php:86
 msgid "Enable Content filter"
 msgstr "Abilita il Filtro Contenuti"
 
-#: nsfw.php:84
+#: nsfw.php:89
 msgid "Comma separated list of keywords to hide"
 msgstr "Elenco separato da virgole di parole da nascondere"
 
-#: nsfw.php:88
-msgid "Submit"
-msgstr "Invia"
+#: nsfw.php:93
+msgid "Save Settings"
+msgstr "Salva Impostazioni"
 
-#: nsfw.php:89
+#: nsfw.php:94
 msgid "Use /expression/ to provide regular expressions"
 msgstr "Utilizza /espressione/ per inserire espressioni regolari"
 
-#: nsfw.php:105
+#: nsfw.php:109
 msgid "NSFW Settings saved."
 msgstr "Impostazioni NSFW salvate."
 
-#: nsfw.php:157
+#: nsfw.php:167
 #, php-format
 msgid "%s - Click to open/close"
 msgstr "%s - Clicca per aprire / chiudere"
index 36f7d972924ac184beb5d1901d2496b8e0ed8390..886299af890718b8a6199889457e5ccbf2f317fe 100644 (file)
@@ -5,11 +5,11 @@ function string_plural_select_it($n){
        return ($n != 1);;
 }}
 ;
-$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Impostazioni per NSWF (Filtro Contenuti Generico)";
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Questo plugin cerca nei messagi le parole/testo che inserisci qui sotto, e collassa i messaggi che li contengono, per non mostrare contenuto inappropriato nel momento sbagliato, come contenuto a sfondo sessuale che può essere inappropriato in un ambiente di lavoro. E' educato (e consigliato) taggare i messaggi che contengono nudità con #NSFW (Not Safe For Work: Non Sicuro Per il Lavoro). Questo filtro può cercare anche qualsiasi parola che inserisci, quindi può essere usato come filtro di contenuti generico.";
+$a->strings["Content Filter (NSFW and more)"] = "Filtro Contenuto (NSFW e altro)";
+$a->strings["This addon searches for specified words/text in posts and collapses them. It can be used to filter content tagged with for instance #NSFW that may be deemed inappropriate at certain times or places, such as being at work. It is also useful for hiding irrelevant or annoying content from direct view."] = "Questo componente aggiuntivo cerca per le parole specificate nei messaggi e li collassa. Può essere usato per filtrare contenuto taggato, per esempio, #NSFW (non sicuro per il lavoro), che puo' risultare inappropriato in certi orari o in certi luoghi, come appunto al lavoro. È anche utile per nascondere contenuto irrilevante o fastidioso.";
 $a->strings["Enable Content filter"] = "Abilita il Filtro Contenuti";
 $a->strings["Comma separated list of keywords to hide"] = "Elenco separato da virgole di parole da nascondere";
-$a->strings["Submit"] = "Invia";
+$a->strings["Save Settings"] = "Salva Impostazioni";
 $a->strings["Use /expression/ to provide regular expressions"] = "Utilizza /espressione/ per inserire espressioni regolari";
 $a->strings["NSFW Settings saved."] = "Impostazioni NSFW salvate.";
 $a->strings["%s - Click to open/close"] = "%s - Clicca per aprire / chiudere";
index 7836003f2ff53c6a1f28592600eca724156f9546..5274da91171ab7d49298659fb811c5870ff45ba8 100644 (file)
@@ -1,7 +1,7 @@
 <?php\r
 \r
 $a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "";\r
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";\r
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";\r
 $a->strings["Enable Content filter"] = "";\r
 $a->strings["Comma separated list of keywords to hide"] = "";\r
 $a->strings["Submit"] = "Lagre";\r
index b99d9ec2d01f7b30063c41fe7bf0e88491e4666f..ea2189ca3b4c6dd3fa56d8d324308830380c36e6 100644 (file)
@@ -1,7 +1,7 @@
 <?php\r
 \r
 $a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "";\r
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";\r
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";\r
 $a->strings["Enable Content filter"] = "";\r
 $a->strings["Comma separated list of keywords to hide"] = "";\r
 $a->strings["Submit"] = "Potwierdź";\r
index 013c8b48542497b2fd3cbcbc4d612f2f6b8b5185..10435354e53ff43c4c5780b343514231d910139b 100644 (file)
@@ -25,7 +25,7 @@ msgstr ""
 
 #: nsfw.php:80
 msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
+"This addon looks in posts for the words/text you specify below, and "
 "collapses any content containing those keywords so it is not displayed at "
 "inappropriate times, such as sexual innuendo that may be improper in a work "
 "setting. It is polite and recommended to tag any content containing nudity "
index 6c1b15d9817b1af07c6331bb44ca804202db834e..21a814923f9b9a1f54c1355d06176315ecaa2f79 100644 (file)
@@ -6,7 +6,7 @@ function string_plural_select_pt_br($n){
 }}
 ;
 $a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "";
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";
 $a->strings["Enable Content filter"] = "Habilitar filtro de conteúdo";
 $a->strings["Comma separated list of keywords to hide"] = "";
 $a->strings["Submit"] = "Enviar";
index 503813c490d032b4f31a52c82104443810002bc8..06d97e3f7143d2c12b3c97caa0ba2cdeb44caa54 100644 (file)
@@ -25,7 +25,7 @@ msgstr "Nesigur Pentru Lucru (Filtrare de Conținut pentru Uz General )"
 
 #: nsfw.php:80
 msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
+"This addon looks in posts for the words/text you specify below, and "
 "collapses any content containing those keywords so it is not displayed at "
 "inappropriate times, such as sexual innuendo that may be improper in a work "
 "setting. It is polite and recommended to tag any content containing nudity "
index 28f71d2c93f60efc59f67c3ba13cb67a1bacb4e4..f03f490f8f8ad41ecf9095cb4fa98c4622c0a9ce 100644 (file)
@@ -6,7 +6,7 @@ function string_plural_select_ro($n){
 }}
 ;
 $a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Nesigur Pentru Lucru (Filtrare de Conținut pentru Uz General )";
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Acest modul verifică în postări, cuvintele/textele pe care le specificați mai jos, și cenzurează orice conținut cu aceste cuvinte cheie, astfel încât să nu se afișeze în momentele necorespunzătoare, precum aluziile sexuale ce pot fi necorespunzătoare într-un mediu de lucru. Este politicos și recomandat să etichetați orice conținut cu nuditate, folosind eticheta #NSFW. Acest filtru poate de asemenea, potrivi orice alt cuvânt/text specificat, şi poate fi folosit astfel și ca filtru de conținut cu scop general.";
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Acest modul verifică în postări, cuvintele/textele pe care le specificați mai jos, și cenzurează orice conținut cu aceste cuvinte cheie, astfel încât să nu se afișeze în momentele necorespunzătoare, precum aluziile sexuale ce pot fi necorespunzătoare într-un mediu de lucru. Este politicos și recomandat să etichetați orice conținut cu nuditate, folosind eticheta #NSFW. Acest filtru poate de asemenea, potrivi orice alt cuvânt/text specificat, şi poate fi folosit astfel și ca filtru de conținut cu scop general.";
 $a->strings["Enable Content filter"] = "Activare filtru de Conținut";
 $a->strings["Comma separated list of keywords to hide"] = "Lista cu separator prin virgulă a cuvintelor cheie, ce vor declanșa ascunderea";
 $a->strings["Submit"] = "Trimite";
index 2ccb5ad143781ea8f4fb14be4f3184a265b8085e..7e821ed8872d103a37282a56d693310a2ffffcbc 100644 (file)
@@ -1,7 +1,7 @@
 <?php\r
 \r
 $a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "";\r
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";\r
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";\r
 $a->strings["Enable Content filter"] = "Включить фильтр содержимого";\r
 $a->strings["Comma separated list of keywords to hide"] = "ключевые слова, которые скрыть (список через запятую)";\r
 $a->strings["Submit"] = "Подтвердить";\r
index 0669361a8007e00c910c55abdbadadc0f8729d67..44e9cc575c5f599302655b14ff89fcbb78c41857 100644 (file)
@@ -1,7 +1,7 @@
 <?php\r
 \r
 $a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "工作不安全(通用内容过滤)设置";\r
-$a->strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "这个插件找您下面输入的词在所有的文章里,和把包括那些词的内容隐藏,省得不妥当的时候表示,比如性的影射在办公室里。是礼貌和建议的把什么包括裸体的内容跟#NSFW标签。这个过滤也会符合设么别的您输入的词,从而能当通用内容过滤有用的。";\r
+$a->strings["This addon looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "这个插件找您下面输入的词在所有的文章里,和把包括那些词的内容隐藏,省得不妥当的时候表示,比如性的影射在办公室里。是礼貌和建议的把什么包括裸体的内容跟#NSFW标签。这个过滤也会符合设么别的您输入的词,从而能当通用内容过滤有用的。";\r
 $a->strings["Enable Content filter"] = "使内容过滤可用";\r
 $a->strings["Comma separated list of keywords to hide"] = "逗号分隔单词要隐藏";\r
 $a->strings["Submit"] = "提交";\r
index af383d20b7cfb6d9f45ebe0e47a704b1bacaa17c..74c64cbe07a099ec28aa662bc87bda11dcce898c 100644 (file)
@@ -1,6 +1,4 @@
 <?php
-
-
 /**
  * Name: NSFW
  * Description: Collapse posts with inappropriate content
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
  * 
  */
-
-function nsfw_install() {
-       register_hook('prepare_body', 'addon/nsfw/nsfw.php', 'nsfw_prepare_body', 10);
-       register_hook('plugin_settings', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings');
-       register_hook('plugin_settings_post', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings_post');
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+
+function nsfw_install()
+{
+       Addon::registerHook('prepare_body', 'addon/nsfw/nsfw.php', 'nsfw_prepare_body', 10);
+       Addon::registerHook('addon_settings', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings');
+       Addon::registerHook('addon_settings_post', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings_post');
 }
 
 
-function nsfw_uninstall() {
-       unregister_hook('prepare_body', 'addon/nsfw/nsfw.php', 'nsfw_prepare_body');
-       unregister_hook('plugin_settings', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings');
-       unregister_hook('plugin_settings_post', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings_post');
-
+function nsfw_uninstall()
+{
+       Addon::unregisterHook('prepare_body', 'addon/nsfw/nsfw.php', 'nsfw_prepare_body');
+       Addon::unregisterHook('addon_settings', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings_post');
 }
 
 // This function isn't perfect and isn't trying to preserve the html structure - it's just a 
 // quick and dirty filter to pull out embedded photo blobs because 'nsfw' seems to come up 
 // inside them quite often. We don't need anything fancy, just pull out the data blob so we can
-// check against the rest of the body. 
-function nsfw_extract_photos($body) {
+// check against the rest of the body.
 
+function nsfw_extract_photos($body)
+{
        $new_body = '';
-       
-       $img_start = strpos($body,'src="data:');
-       $img_end = (($img_start !== false) ? strpos(substr($body,$img_start),'>') : false);
+
+       $img_start = strpos($body, 'src="data:');
+       $img_end = (($img_start !== false) ? strpos(substr($body, $img_start), '>') : false);
 
        $cnt = 0;
 
        while($img_end !== false) {
                $img_end += $img_start;
-               $new_body = $new_body . substr($body,0,$img_start);
-       
+               $new_body = $new_body . substr($body, 0, $img_start);
+
                $cnt ++;
-               $body = substr($body,0,$img_end);
+               $body = substr($body, 0, $img_end);
 
-               $img_start = strpos($body,'src="data:');
-               $img_end = (($img_start !== false) ? strpos(substr($body,$img_start),'>') : false);
+               $img_start = strpos($body, 'src="data:');
+               $img_end = (($img_start !== false) ? strpos(substr($body, $img_start), '>') : false);
 
        }
 
-       if(! $cnt)
+       if (!$cnt) {
                return $body;
-
+       }
        return $new_body;
 }
 
-
-
-
-function nsfw_addon_settings(&$a,&$s) {
-
-
-       if(! local_user())
+function nsfw_addon_settings(&$a, &$s)
+{
+       if (!local_user()) {
                return;
+       }
 
-    /* Add our stylesheet to the page so we can make our settings look nice */
+       /* Add our stylesheet to the page so we can make our settings look nice */
 
-    $a->page['htmlhead'] .= '<link rel="stylesheet"  type="text/css" href="' . $a->get_baseurl() . '/addon/nsfw/nsfw.css' . '" media="all" />' . "\r\n";
+       $a->page['htmlhead'] .= '<link rel="stylesheet"  type="text/css" href="' . $a->get_baseurl() . '/addon/nsfw/nsfw.css' . '" media="all" />' . "\r\n";
 
-       $enable_checked = (intval(get_pconfig(local_user(),'nsfw','disable')) ? '' : ' checked="checked" ');
-       $words = get_pconfig(local_user(),'nsfw','words');
-       if(! $words)
+       $enable_checked = (intval(PConfig::get(local_user(), 'nsfw', 'disable')) ? '' : ' checked="checked" ');
+       $words = PConfig::get(local_user(), 'nsfw', 'words');
+       if (!$words) {
                $words = 'nsfw,';
+       }
 
-    $s .= '<span id="settings_nsfw_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_nsfw_expanded\'); openClose(\'settings_nsfw_inflated\');">';
-    $s .= '<h3>' . t('Not Safe For Work (General Purpose Content Filter)') . '</h3>';
-    $s .= '</span>';
-    $s .= '<div id="settings_nsfw_expanded" class="settings-block" style="display: none;">';
-    $s .= '<span class="fakelink" onclick="openClose(\'settings_nsfw_expanded\'); openClose(\'settings_nsfw_inflated\');">';
-    $s .= '<h3>' . t('Not Safe For Work (General Purpose Content Filter)') . '</h3>';
-    $s .= '</span>';
-
-    $s .= '<div id="nsfw-wrapper">';
-    $s .= '<p>' . t ('This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW.  This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter.') . '</p>';
-    $s .= '<label id="nsfw-enable-label" for="nsfw-enable">' . t('Enable Content filter') . ' </label>';
-    $s .= '<input id="nsfw-enable" type="checkbox" name="nsfw-enable" value="1"' . $enable_checked . ' />';
+       $s .= '<span id="settings_nsfw_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_nsfw_expanded\'); openClose(\'settings_nsfw_inflated\');">';
+       $s .= '<h3>' . L10n::t('Content Filter (NSFW and more)') . '</h3>';
+       $s .= '</span>';
+       $s .= '<div id="settings_nsfw_expanded" class="settings-block" style="display: none;">';
+       $s .= '<span class="fakelink" onclick="openClose(\'settings_nsfw_expanded\'); openClose(\'settings_nsfw_inflated\');">';
+       $s .= '<h3>' . L10n::t('Content Filter (NSFW and more)') . '</h3>';
+       $s .= '</span>';
+
+       $s .= '<div id="nsfw-wrapper">';
+       $s .= '<p>' . L10n::t('This addon searches for specified words/text in posts and collapses them. It can be used to filter content tagged with for instance #NSFW that may be deemed inappropriate at certain times or places, such as being at work. It is also useful for hiding irrelevant or annoying content from direct view.') . '</p>';
+       $s .= '<label id="nsfw-enable-label" for="nsfw-enable">' . L10n::t('Enable Content filter') . ' </label>';
+       $s .= '<input id="nsfw-enable" type="checkbox" name="nsfw-enable" value="1"' . $enable_checked . ' />';
        $s .= '<div class="clear"></div>';
-    $s .= '<label id="nsfw-label" for="nsfw-words">' . t('Comma separated list of keywords to hide') . ' </label>';
-    $s .= '<textarea id="nsfw-words" type="text" name="nsfw-words">' . $words .'</textarea>';
-    $s .= '</div><div class="clear"></div>';
-
-    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="nsfw-submit" name="nsfw-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
-       $s .= '<div class="nsfw-desc">' . t('Use /expression/ to provide regular expressions') . '</div></div>';
+       $s .= '<label id="nsfw-label" for="nsfw-words">' . L10n::t('Comma separated list of keywords to hide') . ' </label>';
+       $s .= '<textarea id="nsfw-words" type="text" name="nsfw-words">' . $words .'</textarea>';
+       $s .= '</div><div class="clear"></div>';
 
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="nsfw-submit" name="nsfw-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
+       $s .= '<div class="nsfw-desc">' . L10n::t('Use /expression/ to provide regular expressions') . '</div></div>';
        return;
-
 }
 
-function nsfw_addon_settings_post(&$a,&$b) {
-
-       if(! local_user())
+function nsfw_addon_settings_post(&$a, &$b)
+{
+       if (!local_user()) {
                return;
+       }
 
-       if($_POST['nsfw-submit']) {
-               set_pconfig(local_user(),'nsfw','words',trim($_POST['nsfw-words']));
-               $enable = ((x($_POST,'nsfw-enable')) ? intval($_POST['nsfw-enable']) : 0);
+       if ($_POST['nsfw-submit']) {
+               PConfig::set(local_user(), 'nsfw', 'words', trim($_POST['nsfw-words']));
+               $enable = (x($_POST,'nsfw-enable') ? intval($_POST['nsfw-enable']) : 0);
                $disable = 1-$enable;
-               set_pconfig(local_user(),'nsfw','disable', $disable);
-               info( t('NSFW Settings saved.') . EOL);
+               PConfig::set(local_user(), 'nsfw', 'disable', $disable);
+               info(L10n::t('NSFW Settings saved.') . EOL);
        }
 }
 
-function nsfw_prepare_body(&$a,&$b) {
-
+function nsfw_prepare_body(&$a, &$b)
+{
+       // Don't do the check when there is a content warning
+       if (!empty($b['item']['content-warning'])) {
+               return;
+       }
 
        $words = null;
-       if(get_pconfig(local_user(),'nsfw','disable'))
+       if (PConfig::get(local_user(), 'nsfw', 'disable')) {
                return;
-
-       if(local_user()) {
-               $words = get_pconfig(local_user(),'nsfw','words');
        }
-       if($words) {
-               $arr = explode(',',$words);
+
+       if (local_user()) {
+               $words = PConfig::get(local_user(), 'nsfw', 'words');
        }
-       else {
-               $arr = array('nsfw');
+       if ($words) {
+               $arr = explode(',', $words);
+       } else {
+               $arr = ['nsfw'];
        }
 
        $found = false;
-       if(count($arr)) {
-
+       if (count($arr)) {
                $body = $b['item']['title'] . "\n" . nsfw_extract_photos($b['html']);
 
-               foreach($arr as $word) {
+               foreach ($arr as $word) {
                        $word = trim($word);
-                       if(! strlen($word)) {
+                       if (!strlen($word)) {
                                continue;
                        }
-                       if(strpos($word,'/') === 0) {
-                               if(preg_match($word,$body)) {
+                       if (strpos($word,'/') === 0) {
+                               if (preg_match($word, $body)) {
                                        $found = true;
                                        break;
                                }
-                       }
-                       else {
-                               if(stristr($body,$word)) {
+                       } else {
+                               if (stristr($body, $word)) {
                                        $found = true;
                                        break;
                                }
-                               if(is_array($b['item']['tags']) && count($b['item']['tags'])) {
-                                       foreach($b['item']['tags'] as $t) {
-                                               if(stristr($t, '>' . $word . '<' )) {
+                               if (is_array($b['item']['tags']) && count($b['item']['tags'])) {
+                                       foreach ($b['item']['tags'] as $t) {
+                                               if (stristr($t, '>' . $word . '<')) {
                                                        $found = true;
                                                        break;
                                                }
@@ -161,8 +161,9 @@ function nsfw_prepare_body(&$a,&$b) {
                        } 
                }               
        }
-       if($found) {
+
+       if ($found) {
                $rnd = random_string(8);
-               $b['html'] = '<div id="nsfw-wrap-' . $rnd . '" class="fakelink" onclick=openClose(\'nsfw-' . $rnd . '\'); >' . sprintf( t('%s - Click to open/close'),$word ) . '</div><div id="nsfw-' . $rnd . '" style="display: none; " >' . $b['html'] . '</div>';  
+               $b['html'] = '<div id="nsfw-wrap-' . $rnd . '" class="fakelink" onclick=openClose(\'nsfw-' . $rnd . '\'); >' . L10n::t('%s - Click to open/close', $word) . '</div><div id="nsfw-' . $rnd . '" style="display: none; " >' . $b['html'] . '</div>';
        }
 }
index 70ac4f838cea751dfa8815d7e5c746674ea4e2c1..e460b1f15762b058cf9b53f1b3e0cc9f72f4a06d 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:21+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index 2f48a0d7d369926412f381b7b9854a8f5ad5594c..7acb914dc7d6a7df820a712d92dd987a7ddba3cf 100644 (file)
@@ -4,15 +4,15 @@
  * Description: Change number of contacts shown of profile sidebar
  * Version: 1.0
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- * 
- *
  */
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 function numfriends_install() {
 
-       register_hook('plugin_settings', 'addon/numfriends/numfriends.php', 'numfriends_settings');
-       register_hook('plugin_settings_post', 'addon/numfriends/numfriends.php', 'numfriends_settings_post');
+       Addon::registerHook('addon_settings', 'addon/numfriends/numfriends.php', 'numfriends_settings');
+       Addon::registerHook('addon_settings_post', 'addon/numfriends/numfriends.php', 'numfriends_settings_post');
 
        logger("installed numfriends");
 }
@@ -20,15 +20,13 @@ function numfriends_install() {
 
 function numfriends_uninstall() {
 
-       unregister_hook('plugin_settings', 'addon/numfriends/numfriends.php', 'numfriends_settings');
-       unregister_hook('plugin_settings_post', 'addon/numfriends/numfriends.php', 'numfriends_settings_post');
+       Addon::unregisterHook('addon_settings', 'addon/numfriends/numfriends.php', 'numfriends_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/numfriends/numfriends.php', 'numfriends_settings_post');
 
 
        logger("removed numfriends");
 }
 
-
-
 /**
  *
  * Callback from the settings post function.
@@ -37,28 +35,24 @@ function numfriends_uninstall() {
  * and if so set our configuration setting for this person.
  *
  */
-
 function numfriends_settings_post($a,$post) {
        if(! local_user() || (! x($_POST,'numfriends-submit')))
                return;
 
-       set_pconfig(local_user(),'system','display_friend_count',intval($_POST['numfriends']));
-       info( t('Numfriends settings updated.') . EOL);
+       PConfig::set(local_user(),'system','display_friend_count',intval($_POST['numfriends']));
+       info( L10n::t('Numfriends settings updated.') . EOL);
 }
 
 
 /**
  *
- * Called from the Plugin Setting form. 
+ * Called from the Addon Setting form. 
  * Add our own settings info to the page.
  *
  */
-
-
-
-function numfriends_settings(&$a,&$s) {
-
-       if(! local_user())
+function numfriends_settings(&$a, &$s)
+{
+       if (! local_user()) {
                return;
 
        /* Add our stylesheet to the page so we can make our settings look nice */
@@ -74,14 +68,13 @@ function numfriends_settings(&$a,&$s) {
        /* Add some HTML to the existing form */
 
        $s .= '<div class="settings-block">';
-       $s .= '<h3>' . t('Numfriends Settings') . '</h3>';
+       $s .= '<h3>' . L10n::t('Numfriends Settings') . '</h3>';
        $s .= '<div id="numfriends-wrapper">';
-       $s .= '<label id="numfriends-label" for="numfriends">' . t('How many contacts to display on profile sidebar') . '</label>';
+       $s .= '<label id="numfriends-label" for="numfriends">' . L10n::t('How many contacts to display on profile sidebar') . '</label>';
        $s .= '<input id="numfriends-input" type="text" name="numfriends" value="' . intval($numfriends) . '" ' . '/>';
        $s .= '</div><div class="clear"></div>';
 
        /* provide a submit button */
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="numfriends-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
-
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="numfriends-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 }
index beac3a2184ef7534365411f3286795a6755b4457..93f231c64c949114c11caf88751b7525a9a68914 100644 (file)
@@ -1,4 +1,4 @@
- ____ OpenStreetMap Plugin ____
+ ____ OpenStreetMap Addon ____
 by Mike Macgirvin
    Klaus Weidenbach
 
@@ -6,7 +6,7 @@ This addon allows you to use OpenStreetMap for displaying locations.
 
 ___ Requirements ___
 
-To use this plugin you need a tile Server that provides the maps.
+To use this addon you need a tile Server that provides the maps.
 OpenStreetMap data is free for everyone to use. Their tile servers are not.
 Please take a look at their "Tile Usage Policy":
 http://wiki.openstreetmap.org/wiki/Tile_usage_policy
@@ -19,9 +19,9 @@ ___ Configuration ___
 If you for any reason prefer to use a configuration file instead 
 of the admin panels, please refer to the Alternative Configuration below. 
 
-Activate the plugin from your admin panel.  
+Activate the addon from your admin panel.  
 
-You can now add a Tile Server and default zoom level in the plugin settings
+You can now add a Tile Server and default zoom level in the addon settings
 page of your admin panel.
 
 The Time Server URL points to the tile server you want to use. Use the full URL,
index d5b1cbfdf95d4caeb8c5a102929355b35b0a5754..db2fe9931521d4813445f141f89b0898d4be1599 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:21+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index 135451698d9cae89d70f17775f9c85fe42c869b2..bfe960fad5e347fcec2b0c3595a977919f78019e 100644 (file)
@@ -8,24 +8,36 @@
  * Author: Klaus Weidenbach
  *
  */
-require_once('include/cache.php');
-
-
-function openstreetmap_install() {
-       register_hook('render_location', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_location');
-       register_hook('generate_map', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_generate_map');
-       register_hook('generate_named_map', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_generate_named_map');
-       register_hook('page_header', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_alterheader');
+use Friendica\Core\Addon;
+use Friendica\Core\Cache;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\System;
+use Friendica\Util\Network;
+
+const OSM_TMS = 'http://www.openstreetmap.org';
+const OSM_NOM = 'http://nominatim.openstreetmap.org/search.php';
+const OSM_ZOOM = 16;
+const OSM_MARKER = 0;
+
+function openstreetmap_install()
+{
+       Addon::registerHook('render_location', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_location');
+       Addon::registerHook('generate_map', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_generate_map');
+       Addon::registerHook('generate_named_map', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_generate_named_map');
+       Addon::registerHook('Map::getCoordinates', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_get_coordinates');
+       Addon::registerHook('page_header', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_alterheader');
 
        logger("installed openstreetmap");
 }
 
-function openstreetmap_uninstall() {
-       unregister_hook('render_location', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_location');
-       unregister_hook('generate_map', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_generate_map');
-       unregister_hook('generate_named_map', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_generate_named_map');
-       unregister_hook('page_header', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_alterheader');
+function openstreetmap_uninstall()
+{
+       Addon::unregisterHook('render_location', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_location');
+       Addon::unregisterHook('generate_map', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_generate_map');
+       Addon::unregisterHook('generate_named_map', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_generate_named_map');
+       Addon::unregisterHook('Map::getCoordinates', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_get_coordinates');
+       Addon::unregisterHook('page_header', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_alterheader');
 
        logger("removed openstreetmap");
 }
@@ -44,9 +56,9 @@ function openstreetmap_alterheader($a, &$navHtml) {
  * @param mixed $a
  * @param array& $item
  */
-function openstreetmap_location($a, &$item) {
-
-       if(! (strlen($item['location']) || strlen($item['coord'])))
+function openstreetmap_location($a, &$item)
+{
+       if (!(strlen($item['location']) || strlen($item['coord']))) {
                return;
 
        /*
@@ -57,30 +69,25 @@ function openstreetmap_location($a, &$item) {
         * ?mlat=lat&mlon=lon for markers.
         */
 
-       $tmsserver = get_config('openstreetmap', 'tmsserver');
-       if(! $tmsserver)
-               $tmsserver = 'http://www.openstreetmap.org';
+       $tmsserver = Config::get('openstreetmap', 'tmsserver', OSM_TMS);
+       $nomserver = Config::get('openstreetmap', 'nomserver', OSM_NOM);
+       $zoom = Config::get('openstreetmap', 'zoom', OSM_ZOOM);
+       $marker = Config::get('openstreetmap', 'marker', OSM_MARKER);
 
-       $nomserver = get_config('openstreetmap', 'nomserver');
-       if(! $nomserver)
-               $nomserver = 'http://nominatim.openstreetmap.org/search.php';
-
-       $zoom = get_config('openstreetmap', 'zoom');
-       if(! $zoom)
-               $zoom = 16;
-
-       $marker = get_config('openstreetmap', 'marker');
-       if(! $marker)
-               $marker = 0;
+       // This is needed since we stored an empty string in the config in previous versions
+       if (empty($nomserver)) {
+               $nomserver = OSM_NOM;
+       }
 
        if ($item['coord'] != "") {
                $coords = explode(' ', $item['coord']);
-               if(count($coords) > 1) {
+               if (count($coords) > 1) {
                        $lat = urlencode(round($coords[0], 5));
                        $lon = urlencode(round($coords[1], 5));
                        $target = $tmsserver;
-                       if($marker > 0)
-                               $target .= '?mlat='.$lat.'&mlon='.$lon;
+                       if ($marker > 0) {
+                               $target .= '?mlat=' . $lat . '&mlon=' . $lon;
+                       }
                        $target .= '#map='.intval($zoom).'/'.$lat.'/'.$lon;
                }
        }
@@ -96,43 +103,53 @@ function openstreetmap_location($a, &$item) {
        $item['html'] = '<a target="map" title="'.$title.'" href= "'.$target.'">'.$title.'</a>';
 }
 
+function openstreetmap_get_coordinates($a, &$b)
+{
+       $nomserver = Config::get('openstreetmap', 'nomserver', OSM_NOM);
 
-function openstreetmap_generate_named_map(&$a,&$b) {
-
+       // This is needed since we stored an empty string in the config in previous versions
+       if (empty($nomserver)) {
+               $nomserver = OSM_NOM;
+       }
 
-       $nomserver = get_config('openstreetmap', 'nomserver');
-       if(! $nomserver)
-               $nomserver = 'http://nominatim.openstreetmap.org/search.php';
        $args = '?q=' . urlencode($b['location']) . '&format=json';
 
-       $x = z_fetch_url($nomserver . $args);
-       if($x['success']) {
-               $j = json_decode($x['body'],true);
+       $cachekey = "openstreetmap:" . $b['location'];
+       $j = Cache::get($cachekey);
 
-               if($j && is_array($j) && $j[0]['lat'] && $j[0]['lon']) {
-                       $arr = array('lat' => $j[0]['lat'],'lon' => $j[0]['lon'],'location' => $b['location'], 'html' => '');
-                       openstreetmap_generate_map($a,$arr);
-                       $b['html'] = $arr['html'];
+       if (is_null($j)) {
+               $x = Network::curl($nomserver . $args);
+               if ($x['success']) {
+                       $j = json_decode($x['body'], true);
+                       Cache::set($cachekey, $j, CACHE_MONTH);
                }
        }
+
+       if (!empty($j[0]['lat']) && !empty($j[0]['lon'])) {
+               $b['lat'] = $j[0]['lat'];
+               $b['lon'] = $j[0]['lon'];
+       }
 }
 
-function openstreetmap_generate_map(&$a,&$b) {
+function openstreetmap_generate_named_map(&$a, &$b)
+{
+       openstreetmap_get_coordinates($a, $b);
 
-       $tmsserver = get_config('openstreetmap', 'tmsserver');
-       if(! $tmsserver)
-               $tmsserver = 'http://www.openstreetmap.org';
-       if(strpos(z_root(),'https:') !== false)
-               $tmsserver = str_replace('http:','https:',$tmsserver);
+       if (!empty($b['lat']) && !empty($b['lon'])) {
+               openstreetmap_generate_map($a, $b);
+       }
+}
 
+function openstreetmap_generate_map(&$a, &$b)
+{
+       $tmsserver = Config::get('openstreetmap', 'tmsserver', OSM_TMS);
 
-       $zoom = get_config('openstreetmap', 'zoom');
-       if(! $zoom)
-               $zoom = 16;
+       if (strpos(z_root(), 'https:') !== false) {
+               $tmsserver = str_replace('http:','https:',$tmsserver);
+       }
 
-       $marker = get_config('openstreetmap', 'marker');
-       if(! $marker)
-               $marker = 0;
+       $zoom = Config::get('openstreetmap', 'zoom', OSM_ZOOM);
+       $marker = Config::get('openstreetmap', 'marker', OSM_MARKER);
 
        $lat = $b['lat']; // round($b['lat'], 5);
        $lon = $b['lon']; // round($b['lon'], 5);
@@ -140,48 +157,60 @@ function openstreetmap_generate_map(&$a,&$b) {
        logger('lat: ' . $lat, LOGGER_DATA);
        logger('lon: ' . $lon, LOGGER_DATA);
 
+       $cardlink = '<a href="' . $tmsserver;
 
-       $b['html'] = '<iframe style="width:100%; height:300px; border:1px solid #ccc" src="' . $tmsserver . '/export/embed.html?bbox=' . ($lon - 0.01) . '%2C' . ($lat - 0.01) . '%2C' . ($lon + 0.01) . '%2C' . ($lat + 0.01) ;
+       if ($marker > 0) {
+               $cardlink .= '?mlat=' . $lat . '&mlon=' . $lon;
+       }
 
-       $b['html'] .=  '&amp;layer=mapnik&amp;marker=' . $lat . '%2C' . $lon . '" style="border: 1px solid black"></iframe><br/><small><a href="' . $tmsserver . '/?mlat=' . $lat . '&mlon=' . $lon . '#map=16/' . $lat . '/' . $lon . '">' . (($b['location']) ? escape_tags($b['location']) : t('View Larger')) . '</a></small>';
+       $cardlink .= '#map=' . $zoom . '/' . $lat . '/' . $lon . '">' . ($b['location'] ? escape_tags($b['location']) : L10n::t('View Larger')) . '</a>';
+       if (empty($b['mode'])) {
+               $b['html'] = '<iframe style="width:100%; height:300px; border:1px solid #ccc" src="' . $tmsserver .
+                               '/export/embed.html?bbox=' . ($lon - 0.01) . '%2C' . ($lat - 0.01) . '%2C' . ($lon + 0.01) . '%2C' . ($lat + 0.01) .
+                               '&amp;layer=mapnik&amp;marker=' . $lat . '%2C' . $lon . '" style="border: 1px solid black"></iframe>' .
+                               '<br/><small>' . $cardlink . '</small>';
+       } else {
+               $b['html'] .= '<br/>' . $cardlink;
+       }
 
        logger('generate_map: ' . $b['html'], LOGGER_DATA);
-
 }
 
-function openstreetmap_plugin_admin(&$a, &$o) {
+function openstreetmap_addon_admin(&$a, &$o)
+{
        $t = get_markup_template("admin.tpl", "addon/openstreetmap/");
-       $tmsserver = get_config('openstreetmap', 'tmsserver');
-       if(! $tmsserver)
-               $tmsserver = 'http://www.openstreetmap.org';
-       $nomserver = get_config('openstreetmap', 'nomserver');
-       if(! $nomserver)
-               $nomserver = 'http://nominatim.openstreetmap.org/search.php';
-       $zoom = get_config('openstreetmap', 'zoom');
-       if(! $zoom)
-               $zoom = 16;
-       $marker = get_config('openstreetmap', 'marker');
-       if(! $marker)
-               $marker = 0;
-
-       $o = replace_macros($t, array(
-                       '$submit' => t('Submit'),
-                       '$tmsserver' => array('tmsserver', t('Tile Server URL'), $tmsserver, t('A list of <a href="http://wiki.openstreetmap.org/wiki/TMS" target="_blank">public tile servers</a>')),
-                       '$nomserver' => array('nomserver', t('Nominatim (reverse geocoding) Server URL'), $nomserver, t('A list of <a href="http://wiki.openstreetmap.org/wiki/Nominatim" target="_blank">Nominatim servers</a>')),
-                       '$zoom' => array('zoom', t('Default zoom'), $zoom, t('The default zoom level. (1:world, 18:highest, also depends on tile server)')),
-                       '$marker' => array('marker', t('Include marker on map'), $marker, t('Include a marker on the map.')),
-       ));
+       $tmsserver = Config::get('openstreetmap', 'tmsserver', OSM_TMS);
+       $nomserver = Config::get('openstreetmap', 'nomserver', OSM_NOM);
+       $zoom = Config::get('openstreetmap', 'zoom', OSM_ZOOM);
+       $marker = Config::get('openstreetmap', 'marker', OSM_MARKER);
+
+       // This is needed since we stored an empty string in the config in previous versions
+       if (empty($nomserver)) {
+               $nomserver = OSM_NOM;
+       }
+
+       $o = replace_macros($t, [
+                       '$submit' => L10n::t('Submit'),
+                       '$tmsserver' => ['tmsserver', L10n::t('Tile Server URL'), $tmsserver, L10n::t('A list of <a href="http://wiki.openstreetmap.org/wiki/TMS" target="_blank">public tile servers</a>')],
+                       '$nomserver' => ['nomserver', L10n::t('Nominatim (reverse geocoding) Server URL'), $nomserver, L10n::t('A list of <a href="http://wiki.openstreetmap.org/wiki/Nominatim" target="_blank">Nominatim servers</a>')],
+                       '$zoom' => ['zoom', L10n::t('Default zoom'), $zoom, L10n::t('The default zoom level. (1:world, 18:highest, also depends on tile server)')],
+                       '$marker' => ['marker', L10n::t('Include marker on map'), $marker, L10n::t('Include a marker on the map.')],
+       ]);
 }
-function openstreetmap_plugin_admin_post(&$a) {
-       $urltms = ((x($_POST, 'tmsserver')) ? notags(trim($_POST['tmsserver'])) : '');
-       $urlnom = ((x($_POST, 'nomserver')) ? notags(trim($_POST['nomserver'])) : '');
-       $zoom = ((x($_POST, 'zoom')) ? intval(trim($_POST['zoom'])) : '16');
-       $marker = ((x($_POST, 'marker')) ? intval(trim($_POST['marker'])) : '0');
-       set_config('openstreetmap', 'tmsserver', $urltms);
-       set_config('openstreetmap', 'nomserver', $urlnom);
-       set_config('openstreetmap', 'zoom', $zoom);
-       set_config('openstreetmap', 'marker', $marker);
-       info( t('Settings updated.') . EOL);
+
+function openstreetmap_addon_admin_post(&$a)
+{
+       $urltms = defaults($_POST, 'tmsserver', OSM_TMS);
+       $urlnom = defaults($_POST, 'nomserver', OSM_NOM);
+       $zoom = defaults($_POST, 'zoom', OSM_ZOOM);
+       $marker = defaults($_POST, 'marker', OSM_MARKER);
+
+       Config::set('openstreetmap', 'tmsserver', $urltms);
+       Config::set('openstreetmap', 'nomserver', $urlnom);
+       Config::set('openstreetmap', 'zoom', $zoom);
+       Config::set('openstreetmap', 'marker', $marker);
+
+       info(L10n::t('Settings updated.') . EOL);
 }
 
 
index 4fd643767e5894b2ef62f298730d38236ccf835b..69ff247681500321023df788e4a05f7536face19 100644 (file)
@@ -1,5 +1,5 @@
 {{include file="field_input.tpl" field=$tmsserver}}
-<!-- {{include file="field_input.tpl" field=$nomserver}}-->
+{{include file="field_input.tpl" field=$nomserver}}
 {{include file="field_input.tpl" field=$zoom}}
 {{include file="field_checkbox.tpl" field=$marker}}
 <div class="submit"><input type="submit" name="openstreetmap" value="{{$submit}}"></div>
index d3fbf9eab044fe940e07602dc08cebbd98febd71..c5d0fa3d9a9644374bbf7b06e1581ccfbf338724 100644 (file)
@@ -2,7 +2,7 @@ Page Header
 
 For server admins only.
 Displays a text message for system announcements'
-The message is entered in the admin account at settings, Plugin settings.
+The message is entered in the admin account at settings, Addon settings.
 
 If you want to use HTML in the pageheader, create a file called pageheader.html 
 in the document root of your friendica instance and add the html there.
\ No newline at end of file
index e0fdbb35660f9f97397bd758805646d1f4875831..f8958d2fabfac71d6ae567a13fa660fafe8ea29b 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
+"POT-Creation-Date: 2018-03-11 18:52+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,14 +17,24 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: pageheader.php:50
+#: pageheader.php:53
 msgid "\"pageheader\" Settings"
 msgstr ""
 
+#: pageheader.php:54
+msgid "Message"
+msgstr ""
+
+#: pageheader.php:54
+msgid ""
+"Message to display on every page on this server (or put a pageheader.html "
+"file in your docroot)"
+msgstr ""
+
 #: pageheader.php:55
-msgid "Submit"
+msgid "Save Settings"
 msgstr ""
 
-#: pageheader.php:68
+#: pageheader.php:69
 msgid "pageheader Settings saved."
 msgstr ""
index 947296d7a237aef2bdfa465e9acc61bd0ac33a9c..c8848b7269c0f26b61b61e62dcb4016ff13984ca 100644 (file)
@@ -4,30 +4,41 @@
 # 
 # 
 # Translators:
-# Abrax <webmaster@a-zwenkau.de>, 2014
-# bavatar <tobias.diekershoff@gmx.net>, 2014
+# Andreas H., 2014
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2014
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-10-15 12:32+0000\n"
-"Last-Translator: Abrax <webmaster@a-zwenkau.de>\n"
-"Language-Team: German (http://www.transifex.com/projects/p/friendica/language/de/)\n"
+"POT-Creation-Date: 2018-03-11 18:52+0100\n"
+"PO-Revision-Date: 2018-03-16 07:42+0000\n"
+"Last-Translator: Tobias Diekershoff <tobias.diekershoff@gmx.net>\n"
+"Language-Team: German (http://www.transifex.com/Friendica/friendica/language/de/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: de\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: pageheader.php:50
+#: pageheader.php:53
 msgid "\"pageheader\" Settings"
 msgstr "\"pageheader\"-Einstellungen"
 
+#: pageheader.php:54
+msgid "Message"
+msgstr "Mitteilung"
+
+#: pageheader.php:54
+msgid ""
+"Message to display on every page on this server (or put a pageheader.html "
+"file in your docroot)"
+msgstr "Die Mitteilung, die auf jeder Seite dieses Knotens angezeigt werden soll (alternativ kann die Datei pageheader.html im Stammverzeichnis der Friendica Installation angelegt werden)."
+
 #: pageheader.php:55
-msgid "Submit"
-msgstr "Senden"
+msgid "Save Settings"
+msgstr "Einstellungen speichern"
 
-#: pageheader.php:68
+#: pageheader.php:69
 msgid "pageheader Settings saved."
 msgstr "pageheader-Einstellungen gespeichert."
index 45f1694005c19258e19ee87704eb3bb677bfcfe3..c0bfeee4cfb70462fc78681c9426139541ecd77d 100644 (file)
@@ -6,5 +6,7 @@ function string_plural_select_de($n){
 }}
 ;
 $a->strings["\"pageheader\" Settings"] = "\"pageheader\"-Einstellungen";
-$a->strings["Submit"] = "Senden";
+$a->strings["Message"] = "Mitteilung";
+$a->strings["Message to display on every page on this server (or put a pageheader.html file in your docroot)"] = "Die Mitteilung, die auf jeder Seite dieses Knotens angezeigt werden soll (alternativ kann die Datei pageheader.html im Stammverzeichnis der Friendica Installation angelegt werden).";
+$a->strings["Save Settings"] = "Einstellungen speichern";
 $a->strings["pageheader Settings saved."] = "pageheader-Einstellungen gespeichert.";
index 186cd470286152e53cf5297c8349e49df144cdc4..f3ac805c9624e800de5db29ea5f107592de35f49 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:21+0000\n"
+"POT-Creation-Date: 2018-03-11 18:52+0100\n"
+"PO-Revision-Date: 2018-03-19 13:19+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -19,14 +19,24 @@ msgstr ""
 "Language: it\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: pageheader.php:50
+#: pageheader.php:53
 msgid "\"pageheader\" Settings"
 msgstr "Impostazioni \"Intestazione pagina\""
 
+#: pageheader.php:54
+msgid "Message"
+msgstr "Messaggio"
+
+#: pageheader.php:54
+msgid ""
+"Message to display on every page on this server (or put a pageheader.html "
+"file in your docroot)"
+msgstr "Il messaggio da mostrare su ogni pagina di questo server (puoi anche aggiungere un file pageheader.html nella root)"
+
 #: pageheader.php:55
-msgid "Submit"
-msgstr "Invia"
+msgid "Save Settings"
+msgstr "Salva Impostazioni"
 
-#: pageheader.php:68
+#: pageheader.php:69
 msgid "pageheader Settings saved."
 msgstr "Impostazioni \"Intestazione pagina\" salvate."
index 8cfd175edca0ba6312b3817ab3a028fda1df7acf..e81ef80d71aed4425034cd1527bac3b6bbf61416 100644 (file)
@@ -6,5 +6,7 @@ function string_plural_select_it($n){
 }}
 ;
 $a->strings["\"pageheader\" Settings"] = "Impostazioni \"Intestazione pagina\"";
-$a->strings["Submit"] = "Invia";
+$a->strings["Message"] = "Messaggio";
+$a->strings["Message to display on every page on this server (or put a pageheader.html file in your docroot)"] = "Il messaggio da mostrare su ogni pagina di questo server (puoi anche aggiungere un file pageheader.html nella root)";
+$a->strings["Save Settings"] = "Salva Impostazioni";
 $a->strings["pageheader Settings saved."] = "Impostazioni \"Intestazione pagina\" salvate.";
index 173fc707ef3f9e3d7ceb76b8447bfa23d597f72a..6a99d64c932bd64103650587f269552c6c9a34c4 100644 (file)
@@ -1,6 +1,4 @@
 <?php
-
-
 /**
  * Name: Page Header
  * Description: Inserts a page header
@@ -9,22 +7,25 @@
  *         Hauke Altmann <https://snarl.de/profile/tugelblend>
  * 
  */
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
 
 function pageheader_install() {
-    register_hook('page_content_top', 'addon/pageheader/pageheader.php', 'pageheader_fetch');
-       register_hook('plugin_settings', 'addon/pageheader/pageheader.php', 'pageheader_addon_settings');
-       register_hook('plugin_settings_post', 'addon/pageheader/pageheader.php', 'pageheader_addon_settings_post');
+    Addon::registerHook('page_content_top', 'addon/pageheader/pageheader.php', 'pageheader_fetch');
+       Addon::registerHook('addon_settings', 'addon/pageheader/pageheader.php', 'pageheader_addon_settings');
+       Addon::registerHook('addon_settings_post', 'addon/pageheader/pageheader.php', 'pageheader_addon_settings_post');
 
 }
 
 
 function pageheader_uninstall() {
-    unregister_hook('page_content_top', 'addon/pageheader/pageheader.php', 'pageheader_fetch');
-       unregister_hook('plugin_settings', 'addon/pageheader/pageheader.php', 'pageheader_addon_settings');
-       unregister_hook('plugin_settings_post', 'addon/pageheader/pageheader.php', 'pageheader_addon_settings_post');
+    Addon::unregisterHook('page_content_top', 'addon/pageheader/pageheader.php', 'pageheader_fetch');
+       Addon::unregisterHook('addon_settings', 'addon/pageheader/pageheader.php', 'pageheader_addon_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/pageheader/pageheader.php', 'pageheader_addon_settings_post');
 
        // hook moved, uninstall the old one if still there. 
-    unregister_hook('page_header', 'addon/pageheader/pageheader.php', 'pageheader_fetch');
+    Addon::unregisterHook('page_header', 'addon/pageheader/pageheader.php', 'pageheader_fetch');
 
 }
 
@@ -47,14 +48,12 @@ function pageheader_addon_settings(&$a,&$s) {
        if(! $words)
                $words = '';
 
-    $s .= '<div class="settings-block">';
-    $s .= '<h3>' . t('"pageheader" Settings') . '</h3>';
-    $s .= '<div id="pageheader-wrapper">';
-    $s .= '<label id="pageheader-label" for="pageheader-words">' . t('Message to display on every page on this server (or put a pageheader.html file in your docroot)') . ' </label>';
-    $s .= '<textarea id="pageheader-words" type="text" name="pageheader-words">' . $words . '</textarea>';
-    $s .= '</div><div class="clear"></div>';
-
-    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="pageheader-submit" name="pageheader-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+       $t = get_markup_template("settings.tpl", "addon/pageheader/");
+       $s .= replace_macros($t, [
+                                       '$title' => L10n::t('"pageheader" Settings'),
+                                       '$phwords' => ['pageheader-words', L10n::t('Message'), $words, L10n::t('Message to display on every page on this server (or put a pageheader.html file in your docroot)')],
+                                       '$submit' => L10n::t('Save Settings')
+       ]);
 
        return;
 
@@ -66,8 +65,8 @@ function pageheader_addon_settings_post(&$a,&$b) {
                return;
 
        if($_POST['pageheader-submit']) {
-               set_config('pageheader','text',trim(strip_tags($_POST['pageheader-words'])));
-               info( t('pageheader Settings saved.') . EOL);
+               Config::set('pageheader','text',trim(strip_tags($_POST['pageheader-words'])));
+               info(L10n::t('pageheader Settings saved.') . EOL);
        }
 }
 
diff --git a/pageheader/templates/settings.tpl b/pageheader/templates/settings.tpl
new file mode 100644 (file)
index 0000000..db1a409
--- /dev/null
@@ -0,0 +1,14 @@
+<span id="settings_pageheader_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose('settings_pageheader_expanded'); openClose('settings_pageheader_inflated');">
+       <h3>{{$title}}</h3>
+</span>
+<div id="settings_pageheader_expanded" class="settings-block" style="display: none;">
+       <span class="fakelink" onclick="openClose('settings_pageheader_expanded'); openClose('settings_pageheader_inflated');">
+               <h3>{{$title}}</h3>
+       </span>
+       {{include file="field_textarea.tpl" field=$phwords}}
+
+       <div class="settings-submit-wrapper" >
+               <input type="submit" id="pageheader-submit" name="pageheader-submit" class="settings-submit" value="{{$submit}}" />
+       </div>
+</div>
+<div class="clear"></div>
index 0ac2ff72b183fd4e1b1c740f94ae492bc48f1fcd..37ece2f0b7dd1119b4fa5c4b365b632c0b4934f0 100644 (file)
@@ -1,4 +1,4 @@
-Piwik Plugin
+Piwik Addon
 ============
 
 by Tobias Diekershoff and Klaus Weidenbach
@@ -9,7 +9,7 @@ tool Piwik into the Friendica pages.
 Requirements
 ------------
 
-To use this plugin you need a [piwik](http://piwik.org/) installation.
+To use this addon you need a [piwik](http://piwik.org/) installation.
 
 Where to find
 -------------
index 45e776abe29750f659c93794f10dd61cb87d9ab7..13e324f730d782656f2a6e80b0b190a911ef77e1 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2015-07-26 12:49+0200\n"
-"PO-Revision-Date: 2015-08-31 10:22+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
diff --git a/piwik/lang/zh-cn/messages.po b/piwik/lang/zh-cn/messages.po
new file mode 100644 (file)
index 0000000..6db5342
--- /dev/null
@@ -0,0 +1,64 @@
+# ADDON piwik
+# Copyright (C)
+# This file is distributed under the same license as the Friendica piwik addon package.
+# 
+# 
+# Translators:
+# 朱陈锬 <tangenters@outlook.com>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-07-26 12:49+0200\n"
+"PO-Revision-Date: 2018-03-01 09:57+0000\n"
+"Last-Translator: 朱陈锬 <tangenters@outlook.com>\n"
+"Language-Team: Chinese (China) (http://www.transifex.com/Friendica/friendica/language/zh_CN/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: piwik.php:79
+msgid ""
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
+msgstr "此网站用 <a href='http://www.piwik.org'>Piwik</a> 追踪分析工具。"
+
+#: piwik.php:82
+#, php-format
+msgid ""
+"If you do not want that your visits are logged in this way you <a "
+"href='%s'>can set a cookie to prevent Piwik from tracking further visits of "
+"the site</a> (opt-out)."
+msgstr ""
+
+#: piwik.php:89
+msgid "Save Settings"
+msgstr "保存设置"
+
+#: piwik.php:90
+msgid "Piwik Base URL"
+msgstr ""
+
+#: piwik.php:90
+msgid ""
+"Absolute path to your Piwik installation. (without protocol (http/s), with "
+"trailing slash)"
+msgstr ""
+
+#: piwik.php:91
+msgid "Site ID"
+msgstr ""
+
+#: piwik.php:92
+msgid "Show opt-out cookie link?"
+msgstr ""
+
+#: piwik.php:93
+msgid "Asynchronous tracking"
+msgstr "异步追踪"
+
+#: piwik.php:105
+msgid "Settings updated."
+msgstr "设置已更新。"
index 21ce8b6fb55ada32b1cd589934b4ef644c127eca..ad99b36495d4a1fb24d02d9733a410569657d7f1 100644 (file)
@@ -1,11 +1,16 @@
-<?php\r
-\r
-$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "这个网站用<a href='http://www.piwik.org'>Piwik</a>分析工具追踪 。";\r
-$a->strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "如果您不想您访问这样记录您<a href='%s'>可以用一个cookie防Piwik追踪未来的访问</a>(选择性退出)。";\r
-$a->strings["Submit"] = "提交";\r
-$a->strings["Piwik Base URL"] = "Piwik基础URL";\r
-$a->strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "绝对道路到Piwik安装。(没有协议(http/s)跟斜线后缀)";\r
-$a->strings["Site ID"] = "网站ID";\r
-$a->strings["Show opt-out cookie link?"] = " 显示选择性退出cookie按钮?";\r
-$a->strings["Asynchronous tracking"] = "异步追踪";\r
-$a->strings["Settings updated."] = "设置跟新了";\r
+<?php
+
+if(! function_exists("string_plural_select_zh_cn")) {
+function string_plural_select_zh_cn($n){
+       return 0;;
+}}
+;
+$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "此网站用 <a href='http://www.piwik.org'>Piwik</a> 追踪分析工具。";
+$a->strings["If you do not want that your visits are logged in this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "";
+$a->strings["Save Settings"] = "保存设置";
+$a->strings["Piwik Base URL"] = "";
+$a->strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "";
+$a->strings["Site ID"] = "";
+$a->strings["Show opt-out cookie link?"] = "";
+$a->strings["Asynchronous tracking"] = "异步追踪";
+$a->strings["Settings updated."] = "设置已更新。";
index 279c82e2ab243b4650b6f43de91bc2e9de4f836b..213125d2779879015859745306440bd438c239aa 100644 (file)
@@ -1,13 +1,13 @@
 <?php
 /**
  * Name: Piwik Analytics
- * Description: Piwik Analytics Plugin for Friendica
+ * Description: Piwik Analytics Addon for Friendica
  * Version: 1.3
  * Author: Tobias Diekershoff <https://f.diekershoff.de/profile/tobias>
  * Author: Klaus Weidenbach
  */
 
-/*   Piwik Analytics Plugin for Friendica
+/*   Piwik Analytics Addon for Friendica
  *
  *   Author: Tobias Diekershoff
  *           tobias.diekershoff@gmx.net
  *     about http/https but beware to put the trailing / at the end of your
  *     setting.
  */
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
 
 function piwik_install() {
-       register_hook('page_end', 'addon/piwik/piwik.php', 'piwik_analytics');
+       Addon::registerHook('page_end', 'addon/piwik/piwik.php', 'piwik_analytics');
 
-       logger("installed piwik plugin");
+       logger("installed piwik addon");
 }
 
 function piwik_uninstall() {
-       unregister_hook('page_end', 'addon/piwik/piwik.php', 'piwik_analytics');
+       Addon::unregisterHook('page_end', 'addon/piwik/piwik.php', 'piwik_analytics');
 
-       logger("uninstalled piwik plugin");
+       logger("uninstalled piwik addon");
 }
 
 function piwik_analytics($a,&$b) {
 
        /*
-        *   styling of every HTML block added by this plugin is done in the
+        *   styling of every HTML block added by this addon is done in the
         *   associated CSS file. We just have to tell Friendica to get it
         *   into the page header.
         */
@@ -76,31 +79,31 @@ function piwik_analytics($a,&$b) {
         */
        if ($optout) {
                $b .= "<div id='piwik-optout-link'>";
-               $b .= t("This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool.");
+               $b .= L10n::t("This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool.");
                $b .= " ";
                $the_url =  "http://".$baseurl ."index.php?module=CoreAdminHome&action=optOut";
-               $b .= sprintf(t("If you do not want that your visits are logged in this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."), $the_url);
+               $b .= L10n::t("If you do not want that your visits are logged in this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out).", $the_url);
                $b .= "</div>";
        }
 }
-function piwik_plugin_admin (&$a, &$o) {
+function piwik_addon_admin (&$a, &$o) {
        $t = get_markup_template( "admin.tpl", "addon/piwik/" );
-       $o = replace_macros( $t, array(
-               '$submit' => t('Save Settings'),
-               '$piwikbaseurl' => array('baseurl', t('Piwik Base URL'), get_config('piwik','baseurl' ), t('Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)')),
-               '$siteid' => array('siteid', t('Site ID'), get_config('piwik','siteid' ), ''),
-               '$optout' => array('optout', t('Show opt-out cookie link?'), get_config('piwik','optout' ), ''),
-               '$async' => array('async', t('Asynchronous tracking'), get_config('piwik','async' ), ''),
-       ));
+       $o = replace_macros( $t, [
+               '$submit' => L10n::t('Save Settings'),
+               '$piwikbaseurl' => ['baseurl', L10n::t('Piwik Base URL'), Config::get('piwik','baseurl' ), L10n::t('Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)')],
+               '$siteid' => ['siteid', L10n::t('Site ID'), Config::get('piwik','siteid' ), ''],
+               '$optout' => ['optout', L10n::t('Show opt-out cookie link?'), Config::get('piwik','optout' ), ''],
+               '$async' => ['async', L10n::t('Asynchronous tracking'), Config::get('piwik','async' ), ''],
+       ]);
 }
-function piwik_plugin_admin_post (&$a) {
+function piwik_addon_admin_post (&$a) {
        $url = ((x($_POST, 'baseurl')) ? notags(trim($_POST['baseurl'])) : '');
        $id = ((x($_POST, 'siteid')) ? trim($_POST['siteid']) : '');
        $optout = ((x($_POST, 'optout')) ? trim($_POST['optout']) : '');
        $async = ((x($_POST, 'async')) ? trim($_POST['async']) : '');
-       set_config('piwik', 'baseurl', $url);
-       set_config('piwik', 'siteid', $id);
-       set_config('piwik', 'optout', $optout);
-       set_config('piwik', 'async', $async);
-       info( t('Settings updated.'). EOL);
+       Config::set('piwik', 'baseurl', $url);
+       Config::set('piwik', 'siteid', $id);
+       Config::set('piwik', 'optout', $optout);
+       Config::set('piwik', 'async', $async);
+       info(L10n::t('Settings updated.'). EOL);
 }
index 843752a1d9e3c72ce72864ed39d9bef8ebd1901a..f0773cc278a72280fe2bd789687220035ac8e60d 100644 (file)
@@ -22,7 +22,7 @@ msgid "Planets Settings"
 msgstr ""
 
 #: planets.php:152
-msgid "Enable Planets Plugin"
+msgid "Enable Planets Addon"
 msgstr ""
 
 #: planets.php:158
index 79fdd6be2493076c2c0af2ea3b831772b09f2630..625dcab920f4ca979a83e783f10aed4f33fdfe58 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Planets Settings"] = "Ajustos de Planet";\r
-$a->strings["Enable Planets Plugin"] = "Activa Plugin de Planet";\r
+$a->strings["Enable Planets Addon"] = "Activa Addon de Planet";\r
 $a->strings["Submit"] = "Enviar";\r
index c47ff06cdb730dbe7c4d07fd482ced114c18ce7b..ac2b9c749a0cf9d4ec127ba0a45152f2c8509da0 100644 (file)
@@ -24,8 +24,8 @@ msgid "Planets Settings"
 msgstr "Planets Nastavení"
 
 #: planets.php:152
-msgid "Enable Planets Plugin"
-msgstr "Povolit Planets plugin"
+msgid "Enable Planets Addon"
+msgstr "Povolit Planets addon"
 
 #: planets.php:158
 msgid "Submit"
index 268f319212a34b96ed3af9f948cb26dcb9aaabb5..c4c0524df3285522223c130a568bbb168d178eb1 100644 (file)
@@ -6,5 +6,5 @@ function string_plural_select_cs($n){
 }}
 ;
 $a->strings["Planets Settings"] = "Planets Nastavení";
-$a->strings["Enable Planets Plugin"] = "Povolit Planets plugin";
+$a->strings["Enable Planets Addon"] = "Povolit Planets addon";
 $a->strings["Submit"] = "Odeslat";
index 42788d569e5e498c2cb549111fc48b026783019d..89f4d07ab1bdbaa6d66eecaf17ce6318a470e6d5 100644 (file)
@@ -25,8 +25,8 @@ msgid "Planets Settings"
 msgstr "Planeten Einstellungen"
 
 #: planets.php:152
-msgid "Enable Planets Plugin"
-msgstr "Planeten-Plugin aktivieren"
+msgid "Enable Planets Addon"
+msgstr "Planeten-Addon aktivieren"
 
 #: planets.php:158
 msgid "Submit"
index ab513fac2347f50a9f90f73f3644baddc864118d..653d025b93618111b7fd46db9abceec7252803a0 100644 (file)
@@ -6,5 +6,5 @@ function string_plural_select_de($n){
 }}
 ;
 $a->strings["Planets Settings"] = "Planeten Einstellungen";
-$a->strings["Enable Planets Plugin"] = "Planeten-Plugin aktivieren";
+$a->strings["Enable Planets Addon"] = "Planeten-Addon aktivieren";
 $a->strings["Submit"] = "Senden";
index 2f9ff97cd31a3e6999467ad3ca1c4414ecbca6cb..c6b6d4130f02c96ce39eee409369c45f116d410c 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Planets Settings"] = "Agordo pri Planets";\r
-$a->strings["Enable Planets Plugin"] = "Ŝalti la Planets kromprogamon";\r
+$a->strings["Enable Planets Addon"] = "Ŝalti la Planets kromprogamon";\r
 $a->strings["Submit"] = "Sendi";\r
index 294da082133045c0b89c981e8411693c7584e885..b1e336591b95f92dbf817852c62a2279dfb6407f 100644 (file)
@@ -24,8 +24,8 @@ msgid "Planets Settings"
 msgstr "Ajustes de Planets"
 
 #: planets.php:152
-msgid "Enable Planets Plugin"
-msgstr "Habilite el plugin Planets"
+msgid "Enable Planets Addon"
+msgstr "Habilite eladdonPlanets"
 
 #: planets.php:158
 msgid "Submit"
index 8c7ef65d17c8cf13f7e4e514e6959826021f5f5e..2fd5ed9034b78110f8918d5f7da567df5cfa2e05 100644 (file)
@@ -6,5 +6,5 @@ function string_plural_select_es($n){
 }}
 ;
 $a->strings["Planets Settings"] = "Ajustes de Planets";
-$a->strings["Enable Planets Plugin"] = "Habilite el plugin Planets";
+$a->strings["Enable Planets Addon"] = "Habilite el addon Planets";
 $a->strings["Submit"] = "Enviar";
index 505d24c34d4f330583555dc6486d0c48f5510ac2..b4524f10249a70f721a157a9e7a8b7ec4d5f97ad 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Planets Settings"] = "Réglages des Planets";\r
-$a->strings["Enable Planets Plugin"] = "Activer Planets";\r
+$a->strings["Enable Planets Addon"] = "Activer Planets";\r
 $a->strings["Submit"] = "Envoyer";\r
index d59b838f25f4f589aeaa468beb171c761c541716..82f8b728a15558f53e67ba3e2ea6bd9333206685 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Planets Settings"] = "";\r
-$a->strings["Enable Planets Plugin"] = "";\r
+$a->strings["Enable Planets Addon"] = "";\r
 $a->strings["Submit"] = "Senda inn";\r
index 4cb0b69412368da43d85482b75480d39fa4c68bd..2cf9592c1da149884a5a722e8fd8dae46259e0db 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:22+0000\n"
+"PO-Revision-Date: 2018-03-19 13:25+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -24,8 +24,8 @@ msgid "Planets Settings"
 msgstr "Impostazioni \"Pianeti\""
 
 #: planets.php:152
-msgid "Enable Planets Plugin"
-msgstr "Abilita il plugin \"Pianeti\""
+msgid "Enable Planets Addon"
+msgstr "Abilita il componente aggiuntivo Pianeti"
 
 #: planets.php:158
 msgid "Submit"
index 1cfa66e6953ec0a6c3620bfe6526f21f66ef3301..1b5aaa91b8c052474a0ea036744b81b40df6a5d3 100644 (file)
@@ -6,5 +6,5 @@ function string_plural_select_it($n){
 }}
 ;
 $a->strings["Planets Settings"] = "Impostazioni \"Pianeti\"";
-$a->strings["Enable Planets Plugin"] = "Abilita il plugin \"Pianeti\"";
+$a->strings["Enable Planets Addon"] = "Abilita il componente aggiuntivo Pianeti";
 $a->strings["Submit"] = "Invia";
index 628eb2aef8d5d563696be5792a85207562e65f3c..7d8fbe48bcd324515fe08f058678992ea673fd09 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Planets Settings"] = "";\r
-$a->strings["Enable Planets Plugin"] = "";\r
+$a->strings["Enable Planets Addon"] = "";\r
 $a->strings["Submit"] = "Lagre";\r
index 971200460fc7e270b4c63efb96ec654481e52d64..0e05c0a47dfe39c5a0a554dbab37af0d3a6a13f5 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Planets Settings"] = "";\r
-$a->strings["Enable Planets Plugin"] = "";\r
+$a->strings["Enable Planets Addon"] = "";\r
 $a->strings["Submit"] = "Potwierdź";\r
index 5cb179c5d901f2015a73481695134b7ddb23a563..6f3b8f10e7a8276e25ed948972fc4f6ef0a4f15f 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Planets Settings"] = "Configuração dos planetas";\r
-$a->strings["Enable Planets Plugin"] = "Habilita configuração dos planetas";\r
+$a->strings["Enable Planets Addon"] = "Habilita configuração dos planetas";\r
 $a->strings["Submit"] = "Enviar";\r
index 67932a8b4d3b191344db8cc0b7fc96612e7a179e..b94394aebebb379030ff39b906f22cef4c3c97eb 100644 (file)
@@ -24,7 +24,7 @@ msgid "Planets Settings"
 msgstr "Configurări Planets"
 
 #: planets.php:152
-msgid "Enable Planets Plugin"
+msgid "Enable Planets Addon"
 msgstr "Activare Modul Planets"
 
 #: planets.php:158
index 93736aad8dbab7601ca74eb81e58b20b5b415fc5..19a2e3deeabb027ce2f1c8f840e1d364a76e4517 100644 (file)
@@ -6,5 +6,5 @@ function string_plural_select_ro($n){
 }}
 ;
 $a->strings["Planets Settings"] = "Configurări Planets";
-$a->strings["Enable Planets Plugin"] = "Activare Modul Planets";
+$a->strings["Enable Planets Addon"] = "Activare Modul Planets";
 $a->strings["Submit"] = "Trimite";
index 1902b826ffa2a2ca6822db1cc2f21cea8eb4684d..b84e2bbca815647eb440ec54304f37315cf1ff30 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Planets Settings"] = "";\r
-$a->strings["Enable Planets Plugin"] = "";\r
+$a->strings["Enable Planets Addon"] = "";\r
 $a->strings["Submit"] = "Подтвердить";\r
index ac066c776c5e6b67a28dcaed247c2476d08c05a3..68de35c6c1de7af3994dc9466bafb7c4dd5ddd5e 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Planets Settings"] = "行星设置";\r
-$a->strings["Enable Planets Plugin"] = "使行星插件可用";\r
+$a->strings["Enable Planets Addon"] = "使行星插件可用";\r
 $a->strings["Submit"] = "提交";\r
index d40e6c61a1b34ba1c92ea390c632e4a1820da122..067db51d6132e2f82d14604282a8e480bf2f314d 100644 (file)
@@ -1,34 +1,36 @@
 <?php
 /**
  * Name: Random Planet, Empirial Version
- * Description: Sample Friendica plugin/addon. Set a random planet from the Emprire when posting.
+ * Description: Sample Friendica addon. Set a random planet from the Emprire when posting.
  * Version: 1.0
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
  * Author: Tony Baldwin <https://free-haven.org/profile/tony>
  */
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 function planets_install() {
 
        /**
-        * 
-        * Our demo plugin will attach in three places.
+        *
+        * Our demo addon will attach in three places.
         * The first is just prior to storing a local post.
         *
         */
 
-       register_hook('post_local', 'addon/planets/planets.php', 'planets_post_hook');
+       Addon::registerHook('post_local', 'addon/planets/planets.php', 'planets_post_hook');
 
        /**
         *
-        * Then we'll attach into the plugin settings page, and also the 
+        * Then we'll attach into the addon settings page, and also the
         * settings post hook so that we can create and update
         * user preferences.
         *
         */
 
-       register_hook('plugin_settings', 'addon/planets/planets.php', 'planets_settings');
-       register_hook('plugin_settings_post', 'addon/planets/planets.php', 'planets_settings_post');
+       Addon::registerHook('addon_settings', 'addon/planets/planets.php', 'planets_settings');
+       Addon::registerHook('addon_settings_post', 'addon/planets/planets.php', 'planets_settings_post');
 
        logger("installed planets");
 }
@@ -44,9 +46,9 @@ function planets_uninstall() {
         *
         */
 
-       unregister_hook('post_local',    'addon/planets/planets.php', 'planets_post_hook');
-       unregister_hook('plugin_settings', 'addon/planets/planets.php', 'planets_settings');
-       unregister_hook('plugin_settings_post', 'addon/planets/planets.php', 'planets_settings_post');
+       Addon::unregisterHook('post_local',    'addon/planets/planets.php', 'planets_post_hook');
+       Addon::unregisterHook('addon_settings', 'addon/planets/planets.php', 'planets_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/planets/planets.php', 'planets_settings_post');
 
 
        logger("removed planets");
@@ -61,7 +63,7 @@ function planets_post_hook($a, &$item) {
         * An item was posted on the local system.
         * We are going to look for specific items:
         *      - A status post by a profile owner
-        *      - The profile owner must have allowed our plugin
+        *      - The profile owner must have allowed our addon
         *
         */
 
@@ -122,7 +124,7 @@ function planets_settings_post($a,$post) {
 
 /**
  *
- * Called from the Plugin Setting form. 
+ * Called from the Addon Setting form.
  * Add our own settings info to the page.
  *
  */
@@ -147,22 +149,22 @@ function planets_settings(&$a,&$s) {
        /* Add some HTML to the existing form */
 
     $s .= '<span id="settings_planets_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_planets_expanded\'); openClose(\'settings_planets_inflated\');">';
-       $s .= '<h3>' . t('Planets') . '</h3>';
+       $s .= '<h3>' . L10n::t('Planets') . '</h3>';
        $s .= '</span>';
        $s .= '<div id="settings_planets_expanded" class="settings-block" style="display: none;">';
        $s .= '<span class="fakelink" onclick="openClose(\'settings_planets_expanded\'); openClose(\'settings_planets_inflated\');">';
-       $s .= '<h3>' . t('Planets') . '</h3>';
+       $s .= '<h3>' . L10n::t('Planets') . '</h3>';
        $s .= '</span>';
 
     $s .= '<div class="settings-block">';
-       $s .= '<h3>' . t('Planets Settings') . '</h3>';
+       $s .= '<h3>' . L10n::t('Planets Settings') . '</h3>';
        $s .= '<div id="planets-enable-wrapper">';
-       $s .= '<label id="planets-enable-label" for="planets-checkbox">' . t('Enable Planets Plugin') . '</label>';
+       $s .= '<label id="planets-enable-label" for="planets-checkbox">' . L10n::t('Enable Planets Addon') . '</label>';
        $s .= '<input id="planets-checkbox" type="checkbox" name="planets" value="1" ' . $checked . '/>';
        $s .= '</div><div class="clear"></div></div>';
 
        /* provide a submit button */
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="planets-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="planets-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
 }
index fdc727b14456a6dde2d22a748a1f0baa95739d5b..1df9c8598da79fa3fda88744e613459a588bef0a 100644 (file)
@@ -5,19 +5,22 @@
  * Version: 1.1
  * Author: tony baldwin <tony@free-haven.org>
  *         Hauke Altmann <https://snarl.de/profile/tugelblend>
- *      
+ *
  */
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
 
 function pledgie_install() { 
-       register_hook('page_end', 'addon/pledgie/pledgie.php', 'pledgie_active'); 
-       register_hook('plugin_settings', 'addon/pledgie/pledgie.php', 'pledgie_addon_settings');
-       register_hook('plugin_settings_post', 'addon/pledgie/pledgie.php', 'pledgie_addon_settings_post');
+       Addon::registerHook('page_end', 'addon/pledgie/pledgie.php', 'pledgie_active'); 
+       Addon::registerHook('addon_settings', 'addon/pledgie/pledgie.php', 'pledgie_addon_settings');
+       Addon::registerHook('addon_settings_post', 'addon/pledgie/pledgie.php', 'pledgie_addon_settings_post');
 }
 
 function pledgie_uninstall() { 
-       unregister_hook('page_end', 'addon/pledgie/pledgie.php', 'pledgie_active');
-       unregister_hook('plugin_settings', 'addon/pledgie/pledgie.php', 'pledgie_addon_settings');
-       unregister_hook('plugin_settings_post', 'addon/pledgie/pledgie.php', 'pledgie_addon_settings_post');
+       Addon::unregisterHook('page_end', 'addon/pledgie/pledgie.php', 'pledgie_active');
+       Addon::unregisterHook('addon_settings', 'addon/pledgie/pledgie.php', 'pledgie_addon_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/pledgie/pledgie.php', 'pledgie_addon_settings_post');
 }
 
 function pledgie_addon_settings(&$a,&$s) {
@@ -39,18 +42,18 @@ function pledgie_addon_settings(&$a,&$s) {
                $describe = '';
 
        $s .= '<div class="settings-block">';
-       $s .= '<h3>' . t('"pledgie" Settings') . '</h3>';
+       $s .= '<h3>' . L10n::t('"pledgie" Settings') . '</h3>';
        $s .= '<div id="pledgie-wrapper">';
-       $s .= '<label id="pledgie-label" for="pledgie-campaign">' . t('Pledgie campaign number to use for donations') . ' </label>';
+       $s .= '<label id="pledgie-label" for="pledgie-campaign">' . L10n::t('Pledgie campaign number to use for donations') . ' </label>';
        $s .= '<input id="pledgie-campaign" type="text" name="pledgie-campaign" value="' . $campaign . '">';
        $s .= '</div><div class="clear"></div>';
        
        $s .= '<div id="pledgie-wrapper">';
-       $s .= '<label id="pledgie-label" for="pledgie-describe">' . t('Description of the Pledgie campaign') . ' </label>';
+       $s .= '<label id="pledgie-label" for="pledgie-describe">' . L10n::t('Description of the Pledgie campaign') . ' </label>';
        $s .= '<input id="pledgie-describe" type="text" name="pledgie-describe" value="' . $describe . '">';
        $s .= '</div><div class="clear"></div>';
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="pledgie-submit" name="pledgie-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="pledgie-submit" name="pledgie-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
        return;
 }
@@ -61,9 +64,9 @@ function pledgie_addon_settings_post(&$a,&$b) {
                return;
 
        if($_POST['pledgie-submit']) {
-               set_config('pledgie-describe','text',trim(strip_tags($_POST['pledgie-describe'])));
-               set_config('pledgie-campaign','text',trim(strip_tags($_POST['pledgie-campaign'])));
-               info( t('pledgie Settings saved.') . EOL);
+               Config::set('pledgie-describe','text',trim(strip_tags($_POST['pledgie-describe'])));
+               Config::set('pledgie-campaign','text',trim(strip_tags($_POST['pledgie-campaign'])));
+               info(L10n::t('pledgie Settings saved.') . EOL);
        }
 }
 
index d323ff0f3fdbd3ee87516f3a0d7b266cd938333a..b1fb49df071c9fbd57a535a7117b535c77a3ffec 100644 (file)
@@ -2,10 +2,10 @@ Public Server
 =============
 
 
-Public Server is a Friendica plugin which implements automatic account & post expiration so that a site may be used as a public
+Public Server is a Friendica addon which implements automatic account & post expiration so that a site may be used as a public
 test bed with reduced data retention. 
 
-This is a modified version of the testdrive plugin, DO NOT ACTIVATE AT THE SAME TIME AS THE TESTDRIVE PLUGIN.
+This is a modified version of the testdrive addon, DO NOT ACTIVATE AT THE SAME TIME AS THE TESTDRIVE ADDON.
 
     //When an account is created on the site, it is given a hard expiration date of 
     $a->config['public_server']['expiredays'] = 30;
@@ -19,7 +19,7 @@ This is a modified version of the testdrive plugin, DO NOT ACTIVATE AT THE SAME
     $a->config['public_server']['flagposts'] = 90;
     $a->config['public_server']['flagpostsexpire'] = 146;
 
-Set these in your .htconfig.php file. By default nothing is defined in case the plugin is activated accidentally. 
+Set these in your .htconfig.php file. By default nothing is defined in case the addon is activated accidentally. 
 They can be ommitted or set to 0 to disable each option.
 The default values are those used by friendica.eu, change these as desired.
 
index 079d46bf5892aeb07289b7cac5b373eb5f02ddba..d4288edb055ec85f2d9bfe951343f738e9c15ce1 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-10-15 09:02+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index 7d8b81365762edd95f8d8764956a2033f53944e8..f6eb03e6a951c4c754d982b28f39970d2dd0e71a 100644 (file)
 <?php
-
 /**
  * Name: public_server
- * Description: Friendica plugin/addon with functions suitable for a public server.
+ * Description: Friendica addon with functions suitable for a public server.
  * Version: 1.1
  * Author: Keith Fernie <http://friendika.me4.it/profile/keith>
  */
 
-
-
-
-function public_server_install() {
-
-       register_hook('register_account', 'addon/public_server/public_server.php', 'public_server_register_account');
-       register_hook('cron', 'addon/public_server/public_server.php', 'public_server_cron');
-        register_hook('enotify','addon/public_server/public_server.php', 'public_server_enotify');
-       register_hook('logged_in', 'addon/public_server/public_server.php', 'public_server_login');
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Database\DBM;
+use Friendica\Util\DateTimeFormat;
+
+function public_server_install()
+{
+       Addon::registerHook('register_account', 'addon/public_server/public_server.php', 'public_server_register_account');
+       Addon::registerHook('cron', 'addon/public_server/public_server.php', 'public_server_cron');
+       Addon::registerHook('enotify', 'addon/public_server/public_server.php', 'public_server_enotify');
+       Addon::registerHook('logged_in', 'addon/public_server/public_server.php', 'public_server_login');
 }
 
-
-function public_server_uninstall() {
-
-       unregister_hook('register_account', 'addon/public_server/public_server.php', 'public_server_register_account');
-       unregister_hook('cron', 'addon/public_server/public_server.php', 'public_server_cron');
-        unregister_hook('enotify','addon/public_server/public_server.php', 'public_server_enotify');
-       unregister_hook('logged_in', 'addon/public_server/public_server.php', 'public_server_login');
+function public_server_uninstall()
+{
+       Addon::unregisterHook('register_account', 'addon/public_server/public_server.php', 'public_server_register_account');
+       Addon::unregisterHook('cron', 'addon/public_server/public_server.php', 'public_server_cron');
+       Addon::unregisterHook('enotify', 'addon/public_server/public_server.php', 'public_server_enotify');
+       Addon::unregisterHook('logged_in', 'addon/public_server/public_server.php', 'public_server_login');
 }
 
-function public_server_register_account($a,$b) {
-
+function public_server_register_account($a, $b)
+{
        $uid = $b;
 
-       $days = get_config('public_server','expiredays');
-       $days_posts = get_config('public_server','expireposts');
-       if(! $days)
+       $days = Config::get('public_server', 'expiredays');
+       $days_posts = Config::get('public_server', 'expireposts');
+       if (!$days) {
                return;
+       }
 
-       $r = q("UPDATE user set account_expires_on = '%s', expire = %d where uid = %d",
-               dbesc(datetime_convert('UTC','UTC','now +' . $days . ' days')),
-               intval($days_posts),
-               intval($uid)
-       );
-
-};
-
+       $fields = ['account_expires_on' => DateTimeFormat::utc('now +' . $days . ' days'), 'expire' => $days_posts];
+       dba::update('user', $fields, ['uid' => $uid]);
+}
 
-function public_server_cron($a,$b) {
+function public_server_cron($a, $b)
+{
        logger("public_server: cron start");
 
        require_once('include/enotify.php');
-       $r = q("select * from user where account_expires_on < UTC_TIMESTAMP() + INTERVAL 5 DAY and account_expires_on > '0000-00-00 00:00:00' and
-               expire_notification_sent = '0000-00-00 00:00:00' ");
-
-       if(count($r)) {
-               foreach($r as $rr) {
-                       notification(array(
+       $r = q("SELECT * FROM `user` WHERE `account_expires_on` < UTC_TIMESTAMP() + INTERVAL 5 DAY AND
+               `account_expires_on` > '%s' AND
+               `expire_notification_sent` <= '%s'",
+               dbesc(NULL_DATE), dbesc(NULL_DATE));
+
+       if (DBM::is_result($r)) {
+               foreach ($r as $rr) {
+                       notification([
                                'uid' => $rr['uid'],
                                'type' => NOTIFY_SYSTEM,
                                'system_type' => 'public_server_expire',
                                'language'     => $rr['language'],
                                'to_name'      => $rr['username'],
                                'to_email'     => $rr['email'],
-                               'source_name'  => t('Administrator'),
+                               'source_name'  => L10n::t('Administrator'),
                                'source_link'  => $a->get_baseurl(),
                                'source_photo' => $a->get_baseurl() . '/images/person-80.jpg',
                        ));
 
-                       q("update user set expire_notification_sent = '%s' where uid = %d",
-                               dbesc(datetime_convert()),
-                               intval($rr['uid'])
-                       );
+                       $fields = ['expire_notification_sent' => DateTimeFormat::utcNow()];
+                       dba::update('user', $fields, ['uid' => $rr['uid']]);
                }
        }
 
-       $r = q("select * from user where account_expired = 1 and account_expires_on < UTC_TIMESTAMP() - INTERVAL 5 DAY and account_expires_on > '0000-00-00 00:00:00'");
-       if(count($r)) {
-               require_once('include/Contact.php');
-               foreach($r as $rr)
-                       user_remove($rr['uid']);
-
-       }
-       $nologin = get_config('public_server','nologin');
-       if($nologin) {
-               $r = q("select uid from user where account_expired = 0 and login_date = '0000-00-00 00:00:00' and register_date <  UTC_TIMESTAMP() - INTERVAL %d DAY and account_expires_on = '0000-00-00 00:00:00'",intval($nologin));
-               if(count($r)) {
-                       foreach($r as $rr)
-                               q("update user set account_expires_on = '%s' where uid = %d",
-                                       dbesc(datetime_convert('UTC','UTC','now +' . '6 days')),
-                                       intval($rr['uid'])
-                       );
+       $nologin = Config::get('public_server', 'nologin', false);
+       if ($nologin) {
+               $r = q("SELECT `uid` FROM `user` WHERE NOT `account_expired` AND `login_date` <= '%s' AND `register_date` < UTC_TIMESTAMP() - INTERVAL %d DAY AND `account_expires_on` <= '%s'",
+                       dbesc(NULL_DATE), intval($nologin), dbesc(NULL_DATE));
+               if (DBM::is_result($r)) {
+                       foreach ($r as $rr) {
+                               $fields = ['account_expires_on' => DateTimeFormat::utc('now +6 days')];
+                               dba::update('user', $fields, ['uid' => $rr['uid']]);
+                       }
                }
-        }
-
-
-        $flagusers = get_config('public_server','flagusers');
-       if($flagusers) {
-               $r = q("select uid from user where account_expired = 0 and login_date < UTC_TIMESTAMP() - INTERVAL %d DAY and account_expires_on = '0000-00-00 00:00:00' and `page-flags` = 0",intval($flagusers));
-               if(count($r)) {
-                       foreach($r as $rr)
-                               q("update user set account_expires_on = '%s' where uid = %d",
-                                       dbesc(datetime_convert('UTC','UTC','now +' . '6 days')),
-                                       intval($rr['uid'])
-                               );
+       }
+
+       $flagusers = Config::get('public_server', 'flagusers', false);
+       if ($flagusers) {
+               $r = q("SELECT `uid` FROM `user` WHERE NOT `account_expired` AND `login_date` < UTC_TIMESTAMP() - INTERVAL %d DAY AND `account_expires_on` <= '%s' AND `page-flags` = 0",
+                       intval($flagusers), dbesc(NULL_DATE));
+               if (DBM::is_result($r)) {
+                       foreach ($r as $rr) {
+                               $fields = ['account_expires_on' => DateTimeFormat::utc('now +6 days')];
+                               dba::update('user', $fields, ['uid' => $rr['uid']]);
+                       }
                }
-        }
+       }
 
-        $flagposts = get_config('public_server','flagposts');
-        $flagpostsexpire = get_config('public_server','flagpostsexpire');
+       $flagposts = Config::get('public_server', 'flagposts');
+       $flagpostsexpire = Config::get('public_server', 'flagpostsexpire');
        if ($flagposts && $flagpostsexpire) {
-               $r = q("select uid from user where account_expired = 0 and login_date < UTC_TIMESTAMP() - INTERVAL %d DAY and account_expires_on = '0000-00-00 00:00:00' and expire = 0 and `page-flags` = 0",intval($flagposts));
-               if(count($r)) {
-                       foreach($r as $rr)
-                               q("update user set expire = %d where uid = %d",
-                                       intval($flagpostsexpire),
-                                       intval($rr['uid'])
-                               );
+               $r = q("SELECT `uid` FROM `user` WHERE NOT `account_expired` AND `login_date` < UTC_TIMESTAMP() - INTERVAL %d DAY AND `account_expires_on` <= '%s' and `expire` = 0 AND `page-flags` = 0",
+                       intval($flagposts), dbesc(NULL_DATE));
+               if (DBM::is_result($r)) {
+                       foreach ($r as $rr) {
+                               dba::update('user', ['expire' => $flagpostsexpire], ['uid' => $rr['uid']]);
+                       }
                }
-        }
+       }
 
        logger("public_server: cron end");
-
 }
 
-function public_server_enotify(&$a, &$b) {
-    if (x($b, 'params') && $b['params']['type'] == NOTIFY_SYSTEM 
+function public_server_enotify(&$a, &$b)
+{
+       if (x($b, 'params') && $b['params']['type'] == NOTIFY_SYSTEM
                && x($b['params'], 'system_type') && $b['params']['system_type'] === 'public_server_expire') {
-        $b['itemlink'] = $a->get_baseurl();
-        $b['epreamble'] = $b['preamble'] = sprintf( t('Your account on %s will expire in a few days.'), get_config('system','sitename'));
-        $b['subject'] = t('Your Friendica account is about to expire.');
-        $b['body'] = sprintf( t("Hi %1\$s,\n\nYour account on %2\$s will expire in less than five days. You may keep your account by logging in at least once every 30 days"), $b['params']['to_name'], "[url=" . $app->config["system"]["url"] . "]" . $app->config["sitename"] . "[/url]");
-    }
+               $b['itemlink'] = $a->get_baseurl();
+               $b['epreamble'] = $b['preamble'] = L10n::t('Your account on %s will expire in a few days.', Config::get('system', 'sitename'));
+               $b['subject'] = L10n::t('Your Friendica account is about to expire.');
+               $b['body'] = L10n::t("Hi %1\$s,\n\nYour account on %2\$s will expire in less than five days. You may keep your account by logging in at least once every 30 days", $b['params']['to_name'], "[url=" . $app->config["system"]["url"] . "]" . $app->config["sitename"] . "[/url]");
+       }
 }
 
-function public_server_login($a,$b) {
-       $days = get_config('public_server','expiredays');
-       if(! $days)
+function public_server_login($a, $b)
+{
+       $days = Config::get('public_server', 'expiredays');
+       if (!$days) {
                return;
-       $r = q("UPDATE user set account_expires_on = '%s' where uid = %d and account_expires_on > '0000-00-00 00:00:00'",
-       dbesc(datetime_convert('UTC','UTC','now +' . $days . ' days')),
-       local_user()
-       );
-}
+       }
 
-function public_server_plugin_admin_post ( &$a ) {
-    check_form_security_token_redirectOnErr('/admin/plugins/publicserver', 'publicserver');
-    $expiredays = (( x($_POST, 'expiredays') ) ? notags(trim($_POST['expiredays'] )) : '');
-    $expireposts = (( x($_POST, 'expireposts') ) ? notags(trim($_POST['expireposts'] )) : '');
-    $nologin = (( x($_POST, 'nologin') ) ? notags(trim($_POST['nologin'] )) : '');
-    $flagusers = (( x($_POST, 'flagusers') ) ? notags(trim($_POST['flagusers'] )) : '');
-    $flagposts = (( x($_POST, 'flagposts') ) ? notags(trim($_POST['flagposts'] )) : '');
-    $flagpostsexpire = (( x($_POST, 'flagpostsexpire') ) ? notags(trim($_POST['flagpostsexpire'] )) : '');
-    set_config( 'public_server','expiredays',$expiredays );
-    set_config( 'public_server','expireposts',$expireposts );
-    set_config( 'public_server','nologin',$nologin );
-    set_config( 'public_server','flagusers',$flagusers);
-    set_config( 'public_server','flagposts',$flagposts );
-    set_config( 'public_server','flagpostsexpire',$flagpostsexpire );
-    info( t('Settings saved').EOL );
+       $fields = ['account_expires_on' => DateTimeFormat::utc('now +' . $days . ' days')];
+       $condition = ["`uid` = ? AND `account_expires_on` > ?", local_user(), NULL_DATE];
+       dba::update('user', $fields, $condition);
 }
-function public_server_plugin_admin ( &$a, &$o) {
-    $token = get_form_security_token("publicserver");
-    $t = get_markup_template( "admin.tpl", "addon/public_server");
-    $o = replace_macros($t, array(
-       '$submit' => t('Save Settings'),
-       '$form_security_token' => $token,
-       '$infotext' => t('Set any of these options to 0 to deactivate it.'),
-       '$expiredays' => Array( "expiredays","Expire Days", intval(get_config('public_server', 'expiredays')), "When an account is created on the site, it is given a hard "),
-       '$expireposts' => Array( "expireposts", "Expire Posts", intval(get_config('public_server','expireposts')), "Set the default days for posts to expire here"),
-       '$nologin' => Array( "nologin", "No Login", intval(get_config('public_server','nologin')), "Remove users who have never logged in after nologin days "),
-       '$flagusers' => Array( "flagusers", "Flag users", intval(get_config('public_server','flagusers')), "Remove users who last logged in over flagusers days ago"),
-       '$flagposts' => Array( "flagposts", "Flag posts", intval(get_config('public_server','flagposts')), "For users who last logged in over flagposts days ago set post expiry days to flagpostsexpire "),
-       '$flagpostsexpire' => Array( "flagpostsexpire", "Flag posts expire", intval(get_config('public_server','flagpostsexpire'))),
-    ));
+
+function public_server_addon_admin_post(&$a)
+{
+       check_form_security_token_redirectOnErr('/admin/addons/publicserver', 'publicserver');
+       $expiredays = (x($_POST, 'expiredays') ? notags(trim($_POST['expiredays'])) : '');
+       $expireposts = (x($_POST, 'expireposts') ? notags(trim($_POST['expireposts'])) : '');
+       $nologin = (x($_POST, 'nologin') ? notags(trim($_POST['nologin'])) : '');
+       $flagusers = (x($_POST, 'flagusers') ? notags(trim($_POST['flagusers'])) : '');
+       $flagposts = (x($_POST, 'flagposts') ? notags(trim($_POST['flagposts'])) : '');
+       $flagpostsexpire = (x($_POST, 'flagpostsexpire') ? notags(trim($_POST['flagpostsexpire'])) : '');
+       Config::set('public_server', 'expiredays', $expiredays);
+       Config::set('public_server', 'expireposts', $expireposts);
+       Config::set('public_server', 'nologin', $nologin);
+       Config::set('public_server', 'flagusers', $flagusers);
+       Config::set('public_server', 'flagposts', $flagposts);
+       Config::set('public_server', 'flagpostsexpire', $flagpostsexpire);
+       info(L10n::t('Settings saved').EOL);
 }
 
+function public_server_addon_admin(&$a, &$o)
+{
+       $token = get_form_security_token("publicserver");
+       $t = get_markup_template("admin.tpl", "addon/public_server");
+       $o = replace_macros($t, [
+               '$submit' => L10n::t('Save Settings'),
+               '$form_security_token' => $token,
+               '$infotext' => L10n::t('Set any of these options to 0 to deactivate it.'),
+               '$expiredays' => ["expiredays","Expire Days", intval(Config::get('public_server', 'expiredays')), "When an account is created on the site, it is given a hard "],
+               '$expireposts' => ["expireposts", "Expire Posts", intval(Config::get('public_server', 'expireposts')), "Set the default days for posts to expire here"],
+               '$nologin' => ["nologin", "No Login", intval(Config::get('public_server', 'nologin')), "Remove users who have never logged in after nologin days "],
+               '$flagusers' => ["flagusers", "Flag users", intval(Config::get('public_server', 'flagusers')), "Remove users who last logged in over flagusers days ago"],
+               '$flagposts' => ["flagposts", "Flag posts", intval(Config::get('public_server', 'flagposts')), "For users who last logged in over flagposts days ago set post expiry days to flagpostsexpire "],
+               '$flagpostsexpire' => ["flagpostsexpire", "Flag posts expire", intval(Config::get('public_server', 'flagpostsexpire'))],
+       ]);
+}
index 84ce856f468f9dee8a01df9c9badd8434a33eee1..a35f0410a4a097f95032630987563277eebd25ed 100644 (file)
@@ -59,7 +59,7 @@ msgid "Import the remote timeline"
 msgstr ""
 
 #: pumpio.php:255
-msgid "Enable pump.io Post Plugin"
+msgid "Enable pump.io Post Addon"
 msgstr ""
 
 #: pumpio.php:260
index 157699e37fe2b3d5055824768f7ba34424cf5904..f5f9f35cedd5e97df943fa7f2eb5126ae11d1d4f 100644 (file)
@@ -61,8 +61,8 @@ msgid "Import the remote timeline"
 msgstr "Importovat vzdálenou časovou osu"
 
 #: pumpio.php:255
-msgid "Enable pump.io Post Plugin"
-msgstr "Aktivovat pump.io Post Plugin"
+msgid "Enable pump.io Post Addon"
+msgstr "Aktivovat pump.io Post Addon"
 
 #: pumpio.php:260
 msgid "Post to pump.io by default"
index 6af0c8137470029d9924d109e0dbaf257ec23888..e5bc749dda5026b2c4315268f2dc41c6681d0d24 100644 (file)
@@ -15,7 +15,7 @@ $a->strings["pump.io username (without the servername)"] = "uživatelské jméno
 $a->strings["pump.io servername (without \"http://\" or \"https://\" )"] = "jméno serveru pump.io  (bez \"http://\" nebo \"https://\" )";
 $a->strings["Authenticate your pump.io connection"] = "Přihlásit ke spojení na pump.io";
 $a->strings["Import the remote timeline"] = "Importovat vzdálenou časovou osu";
-$a->strings["Enable pump.io Post Plugin"] = "Aktivovat pump.io Post Plugin";
+$a->strings["Enable pump.io Post Addon"] = "Aktivovat pump.io Post Addon";
 $a->strings["Post to pump.io by default"] = "Defaultní umístění na pump.oi ";
 $a->strings["Should posts be public?"] = "Mají být příspěvky veřejné?";
 $a->strings["Mirror all public posts"] = "Zrcadlit všechny veřejné příspěvky";
index 4a85f793143d96e0a334daeb26aa76033463a798..acfb87fad72a4fff64cf67d6de343b8547052c43 100644 (file)
@@ -61,8 +61,8 @@ msgid "Import the remote timeline"
 msgstr "Importiere die entfernte Zeitleiste"
 
 #: pumpio.php:255
-msgid "Enable pump.io Post Plugin"
-msgstr "Pump.io-Post-Plugin aktivieren"
+msgid "Enable pump.io Post Addon"
+msgstr "Pump.io-Post-Addon aktivieren"
 
 #: pumpio.php:260
 msgid "Post to pump.io by default"
index 91c1735c0c15088b943237d31619740643d5eba2..4f2c8c88ab841360b362ae65f64bb4002b8241ba 100644 (file)
@@ -15,7 +15,7 @@ $a->strings["pump.io username (without the servername)"] = " Pump.io Nutzername
 $a->strings["pump.io servername (without \"http://\" or \"https://\" )"] = " Pump.io Servername (ohne \"http://\" oder \"https://\" )";
 $a->strings["Authenticate your pump.io connection"] = "Authentifiziere deine  Pump.io Verbindung";
 $a->strings["Import the remote timeline"] = "Importiere die entfernte Zeitleiste";
-$a->strings["Enable pump.io Post Plugin"] = "Pump.io-Post-Plugin aktivieren";
+$a->strings["Enable pump.io Post Addon"] = "Pump.io-Post-Addon aktivieren";
 $a->strings["Post to pump.io by default"] = "Standardmäßig bei  Pump.io veröffentlichen";
 $a->strings["Should posts be public?"] = "Sollen Nachrichten öffentlich sein ?";
 $a->strings["Mirror all public posts"] = "Spiegle alle öffentlichen Nachrichten";
index dd3816264ef6121c752aca0c05b9fbf92bbc50b4..8698199692a368e3821a8534abe280597f7de01d 100644 (file)
@@ -61,8 +61,8 @@ msgid "Import the remote timeline"
 msgstr "Importar la línea de tiempo remota"
 
 #: pumpio.php:255
-msgid "Enable pump.io Post Plugin"
-msgstr "Habilitar Plugin de publicación de Pump.io"
+msgid "Enable pump.io Post Addon"
+msgstr "Habilitar Addon de publicación de Pump.io"
 
 #: pumpio.php:260
 msgid "Post to pump.io by default"
index 8f0a8bfb3a7f660feb5682970b780a0a3f05c456..df9630b22e0856a3eb62c3c07522ea7f7f5dacf4 100644 (file)
@@ -15,7 +15,7 @@ $a->strings["pump.io username (without the servername)"] = "Nombre de usuario de
 $a->strings["pump.io servername (without \"http://\" or \"https://\" )"] = "Nombre de servidor de Pump.io (sin \"http://\" o \"https://\" )";
 $a->strings["Authenticate your pump.io connection"] = "Autenticar su conexión de Pump.io";
 $a->strings["Import the remote timeline"] = "Importar la línea de tiempo remota";
-$a->strings["Enable pump.io Post Plugin"] = "Habilitar Plugin de publicación de Pump.io";
+$a->strings["Enable pump.io Post Addon"] = "Habilitar Addon de publicación de Pump.io";
 $a->strings["Post to pump.io by default"] = "Publicar en Pump.io por defecto";
 $a->strings["Should posts be public?"] = "¿Deberían de ser públicas las entradas?";
 $a->strings["Mirror all public posts"] = "Reflejar todas las entradas públicas";
index 9258d61988cdbb1bbb797d22e5cf5ae1fb6f7dd7..28c5891f0ec7e0d97765dcb608904c17e15012ef 100644 (file)
@@ -62,7 +62,7 @@ msgid "Import the remote timeline"
 msgstr "Importer la timeline distante"
 
 #: pumpio.php:255
-msgid "Enable pump.io Post Plugin"
+msgid "Enable pump.io Post Addon"
 msgstr ""
 
 #: pumpio.php:260
index 3f9331737c59979b98d7cedc5a4400c016367dd5..3e69c2728e0a6da1b6ed61d590bc11b6c83dc267 100644 (file)
@@ -15,7 +15,7 @@ $a->strings["pump.io username (without the servername)"] = "Nom d'utilisateur pu
 $a->strings["pump.io servername (without \"http://\" or \"https://\" )"] = "";
 $a->strings["Authenticate your pump.io connection"] = "";
 $a->strings["Import the remote timeline"] = "Importer la timeline distante";
-$a->strings["Enable pump.io Post Plugin"] = "";
+$a->strings["Enable pump.io Post Addon"] = "";
 $a->strings["Post to pump.io by default"] = "Publier sur pump.io par défaut";
 $a->strings["Should posts be public?"] = "Les messages devraient être publiques ?";
 $a->strings["Mirror all public posts"] = "";
index 3529a080812ade7f26e05b58c234626e3a2b9feb..2ab7e050c783c8f97a511a59b6951f15f7ca1994 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-06-23 14:45+0200\n"
-"PO-Revision-Date: 2015-11-01 11:05+0000\n"
+"PO-Revision-Date: 2018-03-19 13:25+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -61,8 +61,8 @@ msgid "Import the remote timeline"
 msgstr "Importa la timeline remota"
 
 #: pumpio.php:255
-msgid "Enable pump.io Post Plugin"
-msgstr "Abilita il plugin di invio ad pump.io"
+msgid "Enable pump.io Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio ad pump.io"
 
 #: pumpio.php:260
 msgid "Post to pump.io by default"
index 3a26670a4be834bf384373fd62f1f434c6db33cb..86b7ed29212f4808d3b9854d48f2f0437b8529fb 100644 (file)
@@ -15,7 +15,7 @@ $a->strings["pump.io username (without the servername)"] = "nome utente pump.io
 $a->strings["pump.io servername (without \"http://\" or \"https://\" )"] = "nome del server pump.io (senza \"http://\" o \"https://\")";
 $a->strings["Authenticate your pump.io connection"] = "Autentica la tua connessione pump.io";
 $a->strings["Import the remote timeline"] = "Importa la timeline remota";
-$a->strings["Enable pump.io Post Plugin"] = "Abilita il plugin di invio ad pump.io";
+$a->strings["Enable pump.io Post Addon"] = "Abilita il componente aggiuntivo di invio ad pump.io";
 $a->strings["Post to pump.io by default"] = "Invia sempre a pump.io";
 $a->strings["Should posts be public?"] = "I messaggi devono essere pubblici?";
 $a->strings["Mirror all public posts"] = "Clona tutti i messaggi pubblici";
index 8f02e0403644c1d525299a40222bd28d32d02017..bceaa2feef691a3907e29b3b43229cbd58066851 100644 (file)
@@ -61,7 +61,7 @@ msgid "Import the remote timeline"
 msgstr "Importar a linha do tempo remota"
 
 #: pumpio.php:255
-msgid "Enable pump.io Post Plugin"
+msgid "Enable pump.io Post Addon"
 msgstr "Habilitar plug-in para publicar no Pump.io"
 
 #: pumpio.php:260
index 56890a66fd98c8c50b94698897a302d7f2c84db2..e93516b469d78245f3132e24ba1982e3c5823238 100644 (file)
@@ -15,7 +15,7 @@ $a->strings["pump.io username (without the servername)"] = "Nome de usuário no
 $a->strings["pump.io servername (without \"http://\" or \"https://\" )"] = "";
 $a->strings["Authenticate your pump.io connection"] = "";
 $a->strings["Import the remote timeline"] = "Importar a linha do tempo remota";
-$a->strings["Enable pump.io Post Plugin"] = "Habilitar plug-in para publicar no Pump.io";
+$a->strings["Enable pump.io Post Addon"] = "Habilitar plug-in para publicar no Pump.io";
 $a->strings["Post to pump.io by default"] = "Publicar no Pump.io por padrão";
 $a->strings["Should posts be public?"] = "";
 $a->strings["Mirror all public posts"] = "";
index ae3f945bbba7518fc34e10aa4bc16872822cac80..7ac8ef7fafda67e94246370e4cec3f7568ee7326 100644 (file)
@@ -60,7 +60,7 @@ msgid "Import the remote timeline"
 msgstr "Importare cronologie la distanță"
 
 #: pumpio.php:255
-msgid "Enable pump.io Post Plugin"
+msgid "Enable pump.io Post Addon"
 msgstr "Activare Modul Postare pump.io"
 
 #: pumpio.php:260
index bd8bf5f1b01dabc108dfd5917b090b1e5eccf79d..b0ee9a25c1bb6c06d669cc87661bd334fb0787e0 100644 (file)
@@ -15,7 +15,7 @@ $a->strings["pump.io username (without the servername)"] = "Utilizator pump.io (
 $a->strings["pump.io servername (without \"http://\" or \"https://\" )"] = "Nume server pump.io (fără \"http://\" ori \"https://\" )";
 $a->strings["Authenticate your pump.io connection"] = "Autentificați-vă conectarea la pump.io";
 $a->strings["Import the remote timeline"] = "Importare cronologie la distanță";
-$a->strings["Enable pump.io Post Plugin"] = "Activare Modul Postare pump.io";
+$a->strings["Enable pump.io Post Addon"] = "Activare Modul Postare pump.io";
 $a->strings["Post to pump.io by default"] = "Postați implicit pe pump.io";
 $a->strings["Should posts be public?"] = "Postările ar trebui sa fie publice?";
 $a->strings["Mirror all public posts"] = "Reproducere pentru toate postările publice";
index f70801a85d1b09ab12f0be4693b81f4af80967e5..05ab4626e99f307975c05d9c28463cd6349d4437 100644 (file)
@@ -5,35 +5,49 @@
  * Version: 0.2
  * Author: Michael Vogel <http://pirati.ca/profile/heluecht>
  */
-require('addon/pumpio/oauth/http.php');
-require('addon/pumpio/oauth/oauth_client.php');
-require_once('include/enotify.php');
-require_once('include/socgraph.php');
-require_once("include/Photo.php");
-require_once("mod/share.php");
+
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Core\Worker;
+use Friendica\Model\Contact;
+use Friendica\Model\GContact;
+use Friendica\Model\Group;
+use Friendica\Model\Item;
+use Friendica\Model\Queue;
+use Friendica\Model\User;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
+
+require 'addon/pumpio/oauth/http.php';
+require 'addon/pumpio/oauth/oauth_client.php';
+require_once 'include/enotify.php';
+require_once "mod/share.php";
 
 define('PUMPIO_DEFAULT_POLL_INTERVAL', 5); // given in minutes
 
 function pumpio_install() {
-       register_hook('post_local',           'addon/pumpio/pumpio.php', 'pumpio_post_local');
-       register_hook('notifier_normal',      'addon/pumpio/pumpio.php', 'pumpio_send');
-       register_hook('jot_networks',         'addon/pumpio/pumpio.php', 'pumpio_jot_nets');
-       register_hook('connector_settings',      'addon/pumpio/pumpio.php', 'pumpio_settings');
-       register_hook('connector_settings_post', 'addon/pumpio/pumpio.php', 'pumpio_settings_post');
-       register_hook('cron', 'addon/pumpio/pumpio.php', 'pumpio_cron');
-       register_hook('queue_predeliver', 'addon/pumpio/pumpio.php', 'pumpio_queue_hook');
-       register_hook('check_item_notification','addon/pumpio/pumpio.php', 'pumpio_check_item_notification');
+       Addon::registerHook('post_local',           'addon/pumpio/pumpio.php', 'pumpio_post_local');
+       Addon::registerHook('notifier_normal',      'addon/pumpio/pumpio.php', 'pumpio_send');
+       Addon::registerHook('jot_networks',         'addon/pumpio/pumpio.php', 'pumpio_jot_nets');
+       Addon::registerHook('connector_settings',      'addon/pumpio/pumpio.php', 'pumpio_settings');
+       Addon::registerHook('connector_settings_post', 'addon/pumpio/pumpio.php', 'pumpio_settings_post');
+       Addon::registerHook('cron', 'addon/pumpio/pumpio.php', 'pumpio_cron');
+       Addon::registerHook('queue_predeliver', 'addon/pumpio/pumpio.php', 'pumpio_queue_hook');
+       Addon::registerHook('check_item_notification','addon/pumpio/pumpio.php', 'pumpio_check_item_notification');
 }
 
 function pumpio_uninstall() {
-       unregister_hook('post_local',       'addon/pumpio/pumpio.php', 'pumpio_post_local');
-       unregister_hook('notifier_normal',  'addon/pumpio/pumpio.php', 'pumpio_send');
-       unregister_hook('jot_networks',     'addon/pumpio/pumpio.php', 'pumpio_jot_nets');
-       unregister_hook('connector_settings',      'addon/pumpio/pumpio.php', 'pumpio_settings');
-       unregister_hook('connector_settings_post', 'addon/pumpio/pumpio.php', 'pumpio_settings_post');
-       unregister_hook('cron', 'addon/pumpio/pumpio.php', 'pumpio_cron');
-       unregister_hook('queue_predeliver', 'addon/pumpio/pumpio.php', 'pumpio_queue_hook');
-       unregister_hook('check_item_notification','addon/pumpio/pumpio.php', 'pumpio_check_item_notification');
+       Addon::unregisterHook('post_local',       'addon/pumpio/pumpio.php', 'pumpio_post_local');
+       Addon::unregisterHook('notifier_normal',  'addon/pumpio/pumpio.php', 'pumpio_send');
+       Addon::unregisterHook('jot_networks',     'addon/pumpio/pumpio.php', 'pumpio_jot_nets');
+       Addon::unregisterHook('connector_settings',      'addon/pumpio/pumpio.php', 'pumpio_settings');
+       Addon::unregisterHook('connector_settings_post', 'addon/pumpio/pumpio.php', 'pumpio_settings_post');
+       Addon::unregisterHook('cron', 'addon/pumpio/pumpio.php', 'pumpio_cron');
+       Addon::unregisterHook('queue_predeliver', 'addon/pumpio/pumpio.php', 'pumpio_queue_hook');
+       Addon::unregisterHook('check_item_notification','addon/pumpio/pumpio.php', 'pumpio_check_item_notification');
 }
 
 function pumpio_module() {}
@@ -41,7 +55,7 @@ function pumpio_module() {}
 function pumpio_content(&$a) {
 
        if(! local_user()) {
-               notice( t('Permission denied.') . EOL);
+               notice(L10n::t('Permission denied.') . EOL);
                return '';
        }
 
@@ -137,7 +151,7 @@ function pumpio_connect(&$a) {
        if (($consumer_key == "") || ($consumer_secret == "")) {
                logger("pumpio_connect: ".sprintf("Unable to register the client at the pump.io server '%s'.", $hostname));
 
-               $o .= sprintf(t("Unable to register the client at the pump.io server '%s'."), $hostname);
+               $o .= L10n::t("Unable to register the client at the pump.io server '%s'.", $hostname);
                return($o);
        }
 
@@ -147,7 +161,7 @@ function pumpio_connect(&$a) {
        // Let's begin.  First we need a Request Token.  The request token is required to send the user
        // to pumpio's login page.
 
-       // Create a new instance of the TumblrOAuth library.  For this step, all we need to give the library is our
+       // Create a new instance of the oauth_client_class library.  For this step, all we need to give the library is our
        // Consumer Key and Consumer Secret
        $client = new oauth_client_class;
        $client->debug = 1;
@@ -177,8 +191,8 @@ function pumpio_connect(&$a) {
 
        if($success) {
                logger("pumpio_connect: authenticated");
-               $o .= t("You are now authenticated to pumpio.");
-               $o .= '<br /><a href="'.$a->get_baseurl().'/settings/connectors">'.t("return to the connector page").'</a>';
+               $o .= L10n::t("You are now authenticated to pumpio.");
+               $o .= '<br /><a href="'.$a->get_baseurl().'/settings/connectors">'.L10n::t("return to the connector page").'</a>';
        } else {
                logger("pumpio_connect: could not connect");
                $o = 'Could not connect to pumpio. Refresh the page or try again later.';
@@ -196,7 +210,7 @@ function pumpio_jot_nets(&$a,&$b) {
                $pumpio_defpost = get_pconfig(local_user(),'pumpio','post_by_default');
                $selected = ((intval($pumpio_defpost) == 1) ? ' checked="checked" ' : '');
                $b .= '<div class="profile-jot-net"><input type="checkbox" name="pumpio_enable"' . $selected . ' value="1" /> '
-                       . t('Post to pumpio') . '</div>';
+                       . L10n::t('Post to pumpio') . '</div>';
        }
 }
 
@@ -234,20 +248,20 @@ function pumpio_settings(&$a,&$s) {
        /* Add some HTML to the existing form */
 
        $s .= '<span id="settings_pumpio_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_pumpio_expanded\'); openClose(\'settings_pumpio_inflated\');">';
-       $s .= '<img class="connector'.$css.'" src="images/pumpio.png" /><h3 class="connector">'. t('Pump.io Import/Export/Mirror').'</h3>';
+       $s .= '<img class="connector'.$css.'" src="images/pumpio.png" /><h3 class="connector">'. L10n::t('Pump.io Import/Export/Mirror').'</h3>';
        $s .= '</span>';
        $s .= '<div id="settings_pumpio_expanded" class="settings-block" style="display: none;">';
        $s .= '<span class="fakelink" onclick="openClose(\'settings_pumpio_expanded\'); openClose(\'settings_pumpio_inflated\');">';
-       $s .= '<img class="connector'.$css.'" src="images/pumpio.png" /><h3 class="connector">'. t('Pump.io Import/Export/Mirror').'</h3>';
+       $s .= '<img class="connector'.$css.'" src="images/pumpio.png" /><h3 class="connector">'. L10n::t('Pump.io Import/Export/Mirror').'</h3>';
        $s .= '</span>';
 
        $s .= '<div id="pumpio-username-wrapper">';
-       $s .= '<label id="pumpio-username-label" for="pumpio-username">'.t('pump.io username (without the servername)').'</label>';
+       $s .= '<label id="pumpio-username-label" for="pumpio-username">'.L10n::t('pump.io username (without the servername)').'</label>';
        $s .= '<input id="pumpio-username" type="text" name="pumpio_user" value="'.$username.'" />';
        $s .= '</div><div class="clear"></div>';
 
        $s .= '<div id="pumpio-servername-wrapper">';
-       $s .= '<label id="pumpio-servername-label" for="pumpio-servername">'.t('pump.io servername (without "http://" or "https://" )').'</label>';
+       $s .= '<label id="pumpio-servername-label" for="pumpio-servername">'.L10n::t('pump.io servername (without "http://" or "https://" )').'</label>';
        $s .= '<input id="pumpio-servername" type="text" name="pumpio_host" value="'.$servername.'" />';
        $s .= '</div><div class="clear"></div>';
 
@@ -259,36 +273,36 @@ function pumpio_settings(&$a,&$s) {
                $s .= '<div id="pumpio-password-wrapper">';
                if (($oauth_token == "") || ($oauth_token_secret == "")) {
                        $s .= '<div id="pumpio-authenticate-wrapper">';
-                       $s .= '<a href="'.$a->get_baseurl().'/pumpio/connect">'.t("Authenticate your pump.io connection").'</a>';
+                       $s .= '<a href="'.$a->get_baseurl().'/pumpio/connect">'.L10n::t("Authenticate your pump.io connection").'</a>';
                        $s .= '</div><div class="clear"></div>';
                } else {
                        $s .= '<div id="pumpio-import-wrapper">';
-                       $s .= '<label id="pumpio-import-label" for="pumpio-import">' . t('Import the remote timeline') . '</label>';
+                       $s .= '<label id="pumpio-import-label" for="pumpio-import">' . L10n::t('Import the remote timeline') . '</label>';
                        $s .= '<input id="pumpio-import" type="checkbox" name="pumpio_import" value="1" ' . $import_checked . '/>';
                        $s .= '</div><div class="clear"></div>';
 
                        $s .= '<div id="pumpio-enable-wrapper">';
-                       $s .= '<label id="pumpio-enable-label" for="pumpio-checkbox">' . t('Enable pump.io Post Plugin') . '</label>';
+                       $s .= '<label id="pumpio-enable-label" for="pumpio-checkbox">' . L10n::t('Enable pump.io Post Addon') . '</label>';
                        $s .= '<input id="pumpio-checkbox" type="checkbox" name="pumpio" value="1" ' . $checked . '/>';
                        $s .= '</div><div class="clear"></div>';
 
                        $s .= '<div id="pumpio-bydefault-wrapper">';
-                       $s .= '<label id="pumpio-bydefault-label" for="pumpio-bydefault">' . t('Post to pump.io by default') . '</label>';
+                       $s .= '<label id="pumpio-bydefault-label" for="pumpio-bydefault">' . L10n::t('Post to pump.io by default') . '</label>';
                        $s .= '<input id="pumpio-bydefault" type="checkbox" name="pumpio_bydefault" value="1" ' . $def_checked . '/>';
                        $s .= '</div><div class="clear"></div>';
 
                        $s .= '<div id="pumpio-public-wrapper">';
-                       $s .= '<label id="pumpio-public-label" for="pumpio-public">' . t('Should posts be public?') . '</label>';
+                       $s .= '<label id="pumpio-public-label" for="pumpio-public">' . L10n::t('Should posts be public?') . '</label>';
                        $s .= '<input id="pumpio-public" type="checkbox" name="pumpio_public" value="1" ' . $public_checked . '/>';
                        $s .= '</div><div class="clear"></div>';
 
                        $s .= '<div id="pumpio-mirror-wrapper">';
-                       $s .= '<label id="pumpio-mirror-label" for="pumpio-mirror">' . t('Mirror all public posts') . '</label>';
+                       $s .= '<label id="pumpio-mirror-label" for="pumpio-mirror">' . L10n::t('Mirror all public posts') . '</label>';
                        $s .= '<input id="pumpio-mirror" type="checkbox" name="pumpio_mirror" value="1" ' . $mirror_checked . '/>';
                        $s .= '</div><div class="clear"></div>';
 
                        $s .= '<div id="pumpio-delete-wrapper">';
-                       $s .= '<label id="pumpio-delete-label" for="pumpio-delete">' . t('Check to delete this preset') . '</label>';
+                       $s .= '<label id="pumpio-delete-label" for="pumpio-delete">' . L10n::t('Check to delete this preset') . '</label>';
                        $s .= '<input id="pumpio-delete" type="checkbox" name="pumpio_delete" value="1" />';
                        $s .= '</div><div class="clear"></div>';
                }
@@ -298,7 +312,7 @@ function pumpio_settings(&$a,&$s) {
 
        /* provide a submit button */
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="pumpio-submit" name="pumpio-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="pumpio-submit" name="pumpio-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 }
 
 
@@ -449,12 +463,9 @@ function pumpio_send(&$a,&$b) {
        $public = get_pconfig($b['uid'], "pumpio", "public");
 
        if($oauth_token && $oauth_token_secret) {
-
-               require_once('include/bbcode.php');
-
                $title = trim($b['title']);
 
-               $content = bbcode($b['body'], false, false, 4);
+               $content = BBCode::convert($b['body'], false, 4);
 
                $params = array();
 
@@ -522,10 +533,7 @@ function pumpio_send(&$a,&$b) {
                        logger('pumpio_send '.$username.': success '.$post_id);
                        if($post_id && $iscomment) {
                                logger('pumpio_send '.$username.': Update extid '.$post_id." for post id ".$b['id']);
-                               q("UPDATE `item` SET `extid` = '%s' WHERE `id` = %d",
-                                       dbesc($post_id),
-                                       intval($b['id'])
-                               );
+                               Item::update(['extid' => $post_id], ['id' => $b['id']]);
                        }
                } else {
                        logger('pumpio_send '.$username.': '.$url.' general error: ' . print_r($user,true));
@@ -534,12 +542,11 @@ function pumpio_send(&$a,&$b) {
                        if (count($r))
                                $a->contact = $r[0]["id"];
 
-                       $s = serialize(array('url' => $url, 'item' => $b['id'], 'post' => $params));
-                       require_once('include/queue_fn.php');
-                       add_to_queue($a->contact,NETWORK_PUMPIO,$s);
-                       notice(t('Pump.io post failed. Queued for retry.').EOL);
-               }
+                       $s = serialize(['url' => $url, 'item' => $b['id'], 'post' => $params]);
 
+                       Queue::add($a->contact, NETWORK_PUMPIO, $s);
+                       notice(L10n::t('Pump.io post failed. Queued for retry.').EOL);
+               }
        }
 }
 
@@ -611,10 +618,10 @@ function pumpio_action(&$a, $uid, $uri, $action, $content = "") {
                if (count($r))
                        $a->contact = $r[0]["id"];
 
-               $s = serialize(array('url' => $url, 'item' => $orig_post["id"], 'post' => $params));
-               require_once('include/queue_fn.php');
-               add_to_queue($a->contact,NETWORK_PUMPIO,$s);
-               notice(t('Pump.io like failed. Queued for retry.').EOL);
+               $s = serialize(['url' => $url, 'item' => $orig_post["id"], 'post' => $params]);
+
+               Queue::add($a->contact, NETWORK_PUMPIO, $s);
+               notice(L10n::t('Pump.io like failed. Queued for retry.').EOL);
        }
 }
 
@@ -652,7 +659,7 @@ function pumpio_sync(&$a) {
        if ($abandon_days < 1)
                $abandon_days = 0;
 
-       $abandon_limit = date("Y-m-d H:i:s", time() - $abandon_days * 86400);
+       $abandon_limit = date(DateTimeFormat::MYSQL, time() - $abandon_days * 86400);
 
        $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'pumpio' AND `k` = 'import' AND `v` = '1' ORDER BY RAND() ");
        if(count($r)) {
@@ -704,7 +711,7 @@ function pumpio_fetchtimeline(&$a, $uid) {
        //  get the application name for the pump.io app
        //  1st try personal config, then system config and fallback to the
        //  hostname of the node if neither one is set.
-       $application_name  = get_pconfig( $uid, 'pumpio', 'application_name');
+       $application_name  = PConfig::get($uid, 'pumpio', 'application_name');
        if ($application_name == "")
                $application_name  = get_config('pumpio', 'application_name');
        if ($application_name == "")
@@ -851,13 +858,7 @@ function pumpio_dounlike(&$a, $uid, $self, $post, $own_id) {
                        $contactid = $orig_post['contact-id'];
        }
 
-       $r = q("UPDATE `item` SET `deleted` = 1, `unseen` = 1, `changed` = '%s' WHERE `verb` = '%s' AND `uid` = %d AND `contact-id` = %d AND `thr-parent` = '%s'",
-               dbesc(datetime_convert()),
-               dbesc(ACTIVITY_LIKE),
-               intval($uid),
-               intval($contactid),
-               dbesc($orig_post['uri'])
-       );
+       Item::delete(['verb' => ACTIVITY_LIKE, 'uid' => $uid, 'contact-id' => $contactid, 'thr-parent' => $orig_post['uri']]);
 
        if(count($r))
                logger("pumpio_dounlike: unliked existing like. User ".$own_id." ".$uid." Contact: ".$contactid." Url ".$orig_post['uri']);
@@ -948,16 +949,16 @@ function pumpio_dolike(&$a, $uid, $self, $post, $own_id, $threadcompletion = tru
 
        $author  = '[url=' . $likedata['author-link'] . ']' . $likedata['author-name'] . '[/url]';
        $objauthor =  '[url=' . $orig_post['author-link'] . ']' . $orig_post['author-name'] . '[/url]';
-       $post_type = t('status');
+       $post_type = L10n::t('status');
        $plink = '[url=' . $orig_post['plink'] . ']' . $post_type . '[/url]';
        $likedata['object-type'] = ACTIVITY_OBJ_NOTE;
 
-       $likedata['body'] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink);
+       $likedata['body'] = L10n::t('%1$s likes %2$s\'s %3$s', $author, $objauthor, $plink);
 
        $likedata['object'] = '<object><type>' . ACTIVITY_OBJ_NOTE . '</type><local>1</local>' .
                '<id>' . $orig_post['uri'] . '</id><link>' . xmlify('<link rel="alternate" type="text/html" href="' . xmlify($orig_post['plink']) . '" />') . '</link><title>' . $orig_post['title'] . '</title><content>' . $orig_post['body'] . '</content></object>';
 
-       $ret = item_store($likedata);
+       $ret = Item::insert($likedata);
 
        logger("pumpio_dolike: ".$ret." User ".$own_id." ".$uid." Contact: ".$contactid." Url ".$orig_post['uri']);
 }
@@ -983,7 +984,7 @@ function pumpio_get_contact($uid, $contact, $no_insert = false) {
                                        `location`, `about`, `writable`, `blocked`, `readonly`, `pending` )
                                VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', %d, 0, 0, 0)",
                        intval($uid),
-                       dbesc(datetime_convert()),
+                       dbesc(DateTimeFormat::utcNow()),
                        dbesc($contact->url),
                        dbesc(normalise_link($contact->url)),
                        dbesc(str_replace("acct:", "", $contact->id)),
@@ -1049,7 +1050,7 @@ function pumpio_dodelete(&$a, $uid, $self, $post, $own_id) {
                );
 
        if (count($r))
-               return drop_item($r[0]["id"], $false);
+               return Item::deleteById($r[0]["id"]);
 
        $r = q("SELECT * FROM `item` WHERE `extid` = '%s' AND `uid` = %d LIMIT 1",
                                dbesc($post->object->id),
@@ -1057,7 +1058,7 @@ function pumpio_dodelete(&$a, $uid, $self, $post, $own_id) {
                );
 
        if (count($r))
-               return drop_item($r[0]["id"], $false);
+               return Item::deleteById($r[0]["id"]);
 }
 
 function pumpio_dopost(&$a, $client, $uid, $self, $post, $own_id, $threadcompletion = true) {
@@ -1200,11 +1201,11 @@ function pumpio_dopost(&$a, $client, $uid, $self, $post, $own_id, $threadcomplet
        if ($post->object->displayName != "")
                $postarray['title'] = $post->object->displayName;
 
-       $postarray['created'] = datetime_convert('UTC','UTC',$post->published);
+       $postarray['created'] = DateTimeFormat::utc($post->published);
        if (isset($post->updated))
-               $postarray['edited'] = datetime_convert('UTC','UTC',$post->updated);
+               $postarray['edited'] = DateTimeFormat::utc($post->updated);
        elseif (isset($post->received))
-               $postarray['edited'] = datetime_convert('UTC','UTC',$post->received);
+               $postarray['edited'] = DateTimeFormat::utc($post->received);
        else
                $postarray['edited'] = $postarray['created'];
 
@@ -1219,7 +1220,7 @@ function pumpio_dopost(&$a, $client, $uid, $self, $post, $own_id, $threadcomplet
 
                        $postarray['body'] = share_header($share_author, $post->object->author->url,
                                                        $post->object->author->image->url, "",
-                                                       datetime_convert('UTC','UTC',$post->object->created),
+                                                       DateTimeFormat::utc($post->object->created),
                                                        $post->links->self->href).
                                                $postarray['body']."[/share]";
 
@@ -1227,7 +1228,7 @@ function pumpio_dopost(&$a, $client, $uid, $self, $post, $own_id, $threadcomplet
                        $postarray['body'] = "[share author='".$share_author.
                                        "' profile='".$post->object->author->url.
                                        "' avatar='".$post->object->author->image->url.
-                                       "' posted='".datetime_convert('UTC','UTC',$post->object->created).
+                                       "' posted='".DateTimeFormat::convert($post->object->created, 'UTC', 'UTC', ).
                                        "' link='".$post->links->self->href."']".$postarray['body']."[/share]";
                        */
                } else {
@@ -1241,17 +1242,13 @@ function pumpio_dopost(&$a, $client, $uid, $self, $post, $own_id, $threadcomplet
        if (trim($postarray['body']) == "")
                return false;
 
-       $top_item = item_store($postarray);
+       $top_item = Item::insert($postarray);
        $postarray["id"] = $top_item;
 
        if (($top_item == 0) && ($post->verb == "update")) {
-               $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s' , `changed` = '%s' WHERE `uri` = '%s' AND `uid` = %d",
-                       dbesc($postarray["title"]),
-                       dbesc($postarray["body"]),
-                       dbesc($postarray["edited"]),
-                       dbesc($postarray["uri"]),
-                       intval($uid)
-                       );
+               $fields = ['title' => $postarray["title"], 'body' => $postarray["body"], 'changed' => $postarray["edited"]];
+               $condition = ['uri' => $postarray["uri"], 'uid' => $uid];
+               Item::update($fields, $condition);
        }
 
        if ($post->object->objectType == "comment") {
@@ -1297,7 +1294,7 @@ function pumpio_dopost(&$a, $client, $uid, $self, $post, $own_id, $threadcomplet
                                                'to_email'     => $user[0]['email'],
                                                'uid'          => $user[0]['uid'],
                                                'item'         => $postarray,
-                                               'link'         => $a->get_baseurl().'/display/'.urlencode(get_item_guid($top_item)),
+                                               'link'         => $a->get_baseurl().'/display/'.urlencode(Item::getGuidById($top_item)),
                                                'source_name'  => $postarray['author-name'],
                                                'source_link'  => $postarray['author-link'],
                                                'source_photo' => $postarray['author-avatar'],
@@ -1426,8 +1423,6 @@ function pumpio_queue_hook(&$a,&$b) {
        if(! count($qi))
                return;
 
-       require_once('include/queue_fn.php');
-
        foreach($qi as $x) {
                if($x['network'] !== NETWORK_PUMPIO)
                        continue;
@@ -1482,12 +1477,9 @@ function pumpio_queue_hook(&$a,&$b) {
                                logger('pumpio_queue: send '.$username.': success '.$post_id);
                                if($post_id && $iscomment) {
                                        logger('pumpio_send '.$username.': Update extid '.$post_id." for post id ".$z['item']);
-                                       q("UPDATE `item` SET `extid` = '%s' WHERE `id` = %d",
-                                               dbesc($post_id),
-                                               intval($z['item'])
-                                       );
+                                       Item::update(['extid' => $post_id], ['id' => $z['item']]);
                                }
-                               remove_queue_item($x['id']);
+                               Queue::removeItem($x['id']);
                        } else
                                logger('pumpio_queue: send '.$username.': '.$url.' general error: ' . print_r($user,true));
                } else
@@ -1495,7 +1487,7 @@ function pumpio_queue_hook(&$a,&$b) {
 
                if (!$success) {
                        logger('pumpio_queue: delayed');
-                       update_queue_time($x['id']);
+                       Queue::updateTime($x['id']);
                }
        }
 }
@@ -1693,7 +1685,7 @@ function pumpio_fetchallcomments(&$a, $uid, $id) {
 
 
 function pumpio_reachable($url) {
-       $data = z_fetch_url($url, false, $redirects, array('timeout'=>10));
+       $data = Network::curl($url, false, $redirects, ['timeout'=>10]);
        return(intval($data['return_code']) != 0);
 }
 
index decfe2af18449683818ecbd1111e54fdaa78325b..5772fcd2933b85212c47c90d425ee4fa59ead01c 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:22+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index 2c98cba72335fe3be6fbd6c5f2f91178e25acf26..deb6a02f47131608c26530bb33cda503047161a2 100644 (file)
@@ -1,64 +1,58 @@
 <?php
-
-
 /**
  * Name: Quick Comment
  * Description: Two click comments
  * Version: 1.0
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
- * 
+ *
  * Provides a set of text "snippets" which can be inserted into a comment window by clicking on them.
- * First enable the addon in the system admin panel. 
- * Then each person can tailor their choice of words in Settings->Plugin Settings in the Qcomment 
+ * First enable the addon in the system admin panel.
+ * Then each person can tailor their choice of words in Settings->Addon Settings in the Qcomment
  * pane. Initially no qcomments are provided, but on viewing the settings page, a default set of
- * of words is suggested. These can be accepted (click Submit) or edited first. Each text line represents 
- * a different qcomment. 
+ * of words is suggested. These can be accepted (click Submit) or edited first. Each text line represents
+ * a different qcomment.
  * Many themes will hide the qcomments above or immediately adjacent to the comment input box until
  * you wish to use them. On some themes they may be visible.
- * Wave the mouse around near the comment input box and the qcomments will show up. Click on any of 
+ * Wave the mouse around near the comment input box and the qcomments will show up. Click on any of
  * them to open the comment window fully and insert the qcomment. Then "Submit" will submit it.
  *
  */
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 function qcomment_install() {
-       register_hook('plugin_settings', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings');
-       register_hook('plugin_settings_post', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings_post');
+       Addon::registerHook('addon_settings', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings');
+       Addon::registerHook('addon_settings_post', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings_post');
 
 }
 
-
 function qcomment_uninstall() {
-       unregister_hook('plugin_settings', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings');
-       unregister_hook('plugin_settings_post', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings_post');
+       Addon::unregisterHook('addon_settings', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/qcomment/qcomment.php', 'qcomment_addon_settings_post');
 
 }
 
-
-
-
-
-function qcomment_addon_settings(&$a,&$s) {
-
-       if(! local_user())
+function qcomment_addon_settings(&$a, &$s)
+{
+       if (! local_user()) {
                return;
 
     /* Add our stylesheet to the page so we can make our settings look nice */
 
     $a->page['htmlhead'] .= '<link rel="stylesheet"  type="text/css" href="' . $a->get_baseurl() . '/addon/qcomment/qcomment.css' . '" media="all" />' . "\r\n";
 
-       $words = get_pconfig(local_user(),'qcomment','words');
-       if($words === false)
-               $words = t(':-)') . "\n" . t(':-(') . "\n" .  t('lol');
+       $words = PConfig::get(local_user(), 'qcomment', 'words', L10n::t(':-)') . "\n" . L10n::t(':-(') . "\n" .  L10n::t('lol'));
 
-    $s .= '<div class="settings-block">';
-    $s .= '<h3>' . t('Quick Comment Settings') . '</h3>';
-    $s .= '<div id="qcomment-wrapper">';
-       $s .= '<div id="qcomment-desc">' . t("Quick comments are found near comment boxes, sometimes hidden. Click them to provide simple replies.") . '</div>';
-    $s .= '<label id="qcomment-label" for="qcomment-words">' . t('Enter quick comments, one per line') . ' </label>';
-    $s .= '<textarea id="qcomment-words" type="text" name="qcomment-words" >' . htmlspecialchars(unxmlify($words)) . '</textarea>';
-    $s .= '</div><div class="clear"></div>';
+       $s .= '<div class="settings-block">';
+       $s .= '<h3>' . L10n::t('Quick Comment Settings') . '</h3>';
+       $s .= '<div id="qcomment-wrapper">';
+       $s .= '<div id="qcomment-desc">' . L10n::t("Quick comments are found near comment boxes, sometimes hidden. Click them to provide simple replies.") . '</div>';
+       $s .= '<label id="qcomment-label" for="qcomment-words">' . L10n::t('Enter quick comments, one per line') . ' </label>';
+       $s .= '<textarea id="qcomment-words" type="text" name="qcomment-words" >' . htmlspecialchars(unxmlify($words)) . '</textarea>';
+       $s .= '</div><div class="clear"></div>';
 
-    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="qcomment-submit" name="qcomment-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="qcomment-submit" name="qcomment-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
        $s .= '</div>';
 
        return;
@@ -71,8 +65,7 @@ function qcomment_addon_settings_post(&$a,&$b) {
                return;
 
        if($_POST['qcomment-submit']) {
-               set_pconfig(local_user(),'qcomment','words',xmlify($_POST['qcomment-words']));
-               info( t('Quick Comment settings saved.') . EOL);
+               PConfig::set(local_user(),'qcomment','words',xmlify($_POST['qcomment-words']));
+               info(L10n::t('Quick Comment settings saved.') . EOL);
        }
 }
-
index 3494eafd4d40582ae24d27940cd1e9fe4a64e36d..3d2ed587b7bd9e9f4a8ebf3a55a094cc9b63f996 100644 (file)
@@ -22,7 +22,7 @@ msgid "Randplace Settings"
 msgstr ""
 
 #: randplace.php:171
-msgid "Enable Randplace Plugin"
+msgid "Enable Randplace Addon"
 msgstr ""
 
 #: randplace.php:177
index 4e2fe7637584d7f9df1a6a5adebbf3ca3a9de5d3..120fab8cc4ae0273858171232307587d02fb5b8e 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Randplace Settings"] = "Configuració de Randplace";\r
-$a->strings["Enable Randplace Plugin"] = "Habilitar el Plugin de Randplace";\r
+$a->strings["Enable Randplace Addon"] = "Habilitar el Addon de Randplace";\r
 $a->strings["Submit"] = "Enviar";\r
index 6cc09f7d0891b80347a3a981f6628169303e1bcb..09032861cfdef22bdedcd48c2d26fb22c187d8f4 100644 (file)
@@ -24,8 +24,8 @@ msgid "Randplace Settings"
 msgstr "Randplace Nastavení"
 
 #: randplace.php:171
-msgid "Enable Randplace Plugin"
-msgstr "Povolit Randplace Plugin"
+msgid "Enable Randplace Addon"
+msgstr "Povolit Randplace Addon"
 
 #: randplace.php:177
 msgid "Save Settings"
index dae496fc2b9140d76b8c7d54da4aa3e2649c73d9..a5a72e9ef2ac191344825c041771831c03e0744b 100644 (file)
@@ -6,5 +6,5 @@ function string_plural_select_cs($n){
 }}
 ;
 $a->strings["Randplace Settings"] = "Randplace Nastavení";
-$a->strings["Enable Randplace Plugin"] = "Povolit Randplace Plugin";
+$a->strings["Enable Randplace Addon"] = "Povolit Randplace Addon";
 $a->strings["Save Settings"] = "Uložit Nastavení";
index 8735e20d0823c3dee8e7fbc325832110bb829984..c575242fd663557c6b70e7648cfd10c5a469f18a 100644 (file)
@@ -24,8 +24,8 @@ msgid "Randplace Settings"
 msgstr "Randplace-Einstellungen"
 
 #: randplace.php:171
-msgid "Enable Randplace Plugin"
-msgstr "Randplace-Plugin aktivieren"
+msgid "Enable Randplace Addon"
+msgstr "Randplace-Addon aktivieren"
 
 #: randplace.php:177
 msgid "Save Settings"
index 29bec858270f3c6534ce1be307472d439d40d568..5a5b69f324bdee67b08218419f25fac1e3ed0e11 100644 (file)
@@ -6,5 +6,5 @@ function string_plural_select_de($n){
 }}
 ;
 $a->strings["Randplace Settings"] = "Randplace-Einstellungen";
-$a->strings["Enable Randplace Plugin"] = "Randplace-Plugin aktivieren";
+$a->strings["Enable Randplace Addon"] = "Randplace-Addon aktivieren";
 $a->strings["Save Settings"] = "Einstellungen speichern";
index 4550209303b7206a478d7313cdc9e08ceef6e5e1..38e6ebfa39ed704df873471a98cb8a34c7a6148b 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Randplace Settings"] = "Randplace agordoj.";\r
-$a->strings["Enable Randplace Plugin"] = "Aktivigi la Randplace kromprogramon.";\r
+$a->strings["Enable Randplace Addon"] = "Aktivigi la Randplace kromprogramon.";\r
 $a->strings["Submit"] = "Sendi";\r
index 0b63aa17b79565c864ae3b45e0bb1f167067c461..7f0a1047a361d673b56e27d745a6e0c65c84e4a8 100644 (file)
@@ -24,8 +24,8 @@ msgid "Randplace Settings"
 msgstr "Ajustes de Randplace"
 
 #: randplace.php:171
-msgid "Enable Randplace Plugin"
-msgstr "Habilitar el Plugin de Randplace"
+msgid "Enable Randplace Addon"
+msgstr "Habilitar el Addon de Randplace"
 
 #: randplace.php:177
 msgid "Submit"
index 716845ac6aa45aea09074731e20056996909b716..b196c6b89e39631fdab35a551336ebc2b1e82d86 100644 (file)
@@ -6,5 +6,5 @@ function string_plural_select_es($n){
 }}
 ;
 $a->strings["Randplace Settings"] = "Ajustes de Randplace";
-$a->strings["Enable Randplace Plugin"] = "Habilitar el Plugin de Randplace";
+$a->strings["Enable Randplace Addon"] = "Habilitar el Addon de Randplace";
 $a->strings["Submit"] = "Enviar";
index f85b1cbae0bfae97337bf0d50430e6fe5523dc8b..f9d354b4d21765fdf0ff106001d056b533915ba1 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Randplace Settings"] = "Réglages de Randplace";\r
-$a->strings["Enable Randplace Plugin"] = "Activer l'extension Randplace";\r
+$a->strings["Enable Randplace Addon"] = "Activer l'extension Randplace";\r
 $a->strings["Submit"] = "Envoyer";\r
index 924285d47ab59a12c310bc16b906957b444668d7..85e49238b8735d4c4b4578ab67832187271e99d8 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Randplace Settings"] = "Stilla Randplace";\r
-$a->strings["Enable Randplace Plugin"] = "Kveikja á Randplace einingu";\r
+$a->strings["Enable Randplace Addon"] = "Kveikja á Randplace einingu";\r
 $a->strings["Submit"] = "Senda inn";\r
index d2fa89032c090df02336ab181420d6f8e484942b..30ee265315f95dc2cd9961609f2e9856246985e4 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:22+0000\n"
+"PO-Revision-Date: 2018-03-19 13:25+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -24,8 +24,8 @@ msgid "Randplace Settings"
 msgstr "Impostazioni \"Posizione casuale\""
 
 #: randplace.php:171
-msgid "Enable Randplace Plugin"
-msgstr "Abilita il plugin \"Posizione casuale\""
+msgid "Enable Randplace Addon"
+msgstr "Abilita il componente aggiuntivo Posizione Casuale"
 
 #: randplace.php:177
 msgid "Submit"
index 08e17fa78c1b8aad70492477474eac6cd4b6c91d..1a26d7770dd9378e6c8693c81d10dbea2e257b3c 100644 (file)
@@ -6,5 +6,5 @@ function string_plural_select_it($n){
 }}
 ;
 $a->strings["Randplace Settings"] = "Impostazioni \"Posizione casuale\"";
-$a->strings["Enable Randplace Plugin"] = "Abilita il plugin \"Posizione casuale\"";
+$a->strings["Enable Randplace Addon"] = "Abilita il componente aggiuntivo Posizione Casuale";
 $a->strings["Submit"] = "Invia";
index 16518f390f53e762e5cab37bf6168a6cae30ba92..0675219c72247191b2c39bc42d57990b30bced04 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Randplace Settings"] = "Tilfeldig plassering";\r
-$a->strings["Enable Randplace Plugin"] = "Aktiver Tilfeldig plassering-tillegget";\r
+$a->strings["Enable Randplace Addon"] = "Aktiver Tilfeldig plassering-tillegget";\r
 $a->strings["Submit"] = "Lagre";\r
index 3f1b2f9fd0f3588d3753f9ccc747e6e4aec33faa..4166face25759ffaebeecc635f72261acf8eaa7c 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Randplace Settings"] = "Ustawienia Randplace";\r
-$a->strings["Enable Randplace Plugin"] = "Włącz Randplace Plugin";\r
+$a->strings["Enable Randplace Addon"] = "Włącz Randplace Addon";\r
 $a->strings["Submit"] = "Potwierdź";\r
index 1f010b4237ca31a211ebb8a34a56189dd8ab26d4..b41c865d46cf983f94fb5905f2f1a05fb3a24896 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Randplace Settings"] = "Configurações do Randplace";\r
-$a->strings["Enable Randplace Plugin"] = "Habilitar o plugin Randplace";\r
+$a->strings["Enable Randplace Addon"] = "Habilitar o addon Randplace";\r
 $a->strings["Submit"] = "Enviar";\r
index 1138665f6a392d730b3f75656ad26fd089494758..f900373fb1986cfb3a386388f9305213769ca0b3 100644 (file)
@@ -23,7 +23,7 @@ msgid "Randplace Settings"
 msgstr "Configurări Randplace"
 
 #: randplace.php:171
-msgid "Enable Randplace Plugin"
+msgid "Enable Randplace Addon"
 msgstr "Activare Modul Randplace"
 
 #: randplace.php:177
index 9ef0274ffc9044c851603f19266bd1bf56ee441d..81607079b83bb12aecdc1cd39f7780372128c1b2 100644 (file)
@@ -6,5 +6,5 @@ function string_plural_select_ro($n){
 }}
 ;
 $a->strings["Randplace Settings"] = "Configurări Randplace";
-$a->strings["Enable Randplace Plugin"] = "Activare Modul Randplace";
+$a->strings["Enable Randplace Addon"] = "Activare Modul Randplace";
 $a->strings["Save Settings"] = "Salvare Configurări";
index 482c4ed090545dc50ca0ab0e4e7aeb3f010e65e9..46733dc680a02fec6a0fdaf22376c2ad6872e986 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Randplace Settings"] = "Настройки Случайного места";\r
-$a->strings["Enable Randplace Plugin"] = "Включить Randplace  плагин";\r
+$a->strings["Enable Randplace Addon"] = "Включить Randplace  плагин";\r
 $a->strings["Submit"] = "Подтвердить";\r
index eec3a7bd68754d1500306f2f4e2cb78014d83171..c47a51cae678d7fb7c400ea9803ac29c289b5506 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Randplace Settings"] = "Randplace Settings";\r
-$a->strings["Enable Randplace Plugin"] = "Enable Randplace Plugin";\r
+$a->strings["Enable Randplace Addon"] = "Enable Randplace Addon";\r
 $a->strings["Submit"] = "Spara";\r
index 5b96f0867c29f1b0905ab8bffb88103e4e79ce56..2b9b82e39de9814fce5339c85bb9eafd43886f61 100644 (file)
@@ -1,5 +1,5 @@
 <?php\r
 \r
 $a->strings["Randplace Settings"] = "随意下设置";\r
-$a->strings["Enable Randplace Plugin"] = "使随意下插件能用";\r
+$a->strings["Enable Randplace Addon"] = "使随意下插件能用";\r
 $a->strings["Submit"] = "提交";\r
index 27589b1ceceb756ac52e144254e892b17b802bf0..ca4d3d797d0783d24a5becefb3f1aabc448a3dcc 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /**
  * Name: Random place
- * Description: Sample Friendica plugin/addon. Set a random place when posting.
+ * Description: Sample Friendica addon. Set a random place when posting.
  * Version: 1.0
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
  * 
  * Addons are registered with the system through the admin
  * panel.
  *
- * When registration is detected, the system calls the plugin
+ * When registration is detected, the system calls the addon
  * name_install() function, located in 'addon/name/name.php',
  * where 'name' is the name of the addon.
  * If the addon is removed from the configuration list, the 
  * system will call the name_uninstall() function.
  *
  */
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 function randplace_install() {
 
        /**
-        * 
-        * Our demo plugin will attach in three places.
+        *
+        * Our demo addon will attach in three places.
         * The first is just prior to storing a local post.
         *
         */
 
-       register_hook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
+       Addon::registerHook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
 
        /**
         *
-        * Then we'll attach into the plugin settings page, and also the 
+        * Then we'll attach into the addon settings page, and also the
         * settings post hook so that we can create and update
         * user preferences.
         *
         */
 
-       register_hook('plugin_settings', 'addon/randplace/randplace.php', 'randplace_settings');
-       register_hook('plugin_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
+       Addon::registerHook('addon_settings', 'addon/randplace/randplace.php', 'randplace_settings');
+       Addon::registerHook('addon_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
 
        logger("installed randplace");
 }
@@ -56,9 +58,9 @@ function randplace_uninstall() {
         *
         */
 
-       unregister_hook('post_local',    'addon/randplace/randplace.php', 'randplace_post_hook');
-       unregister_hook('plugin_settings', 'addon/randplace/randplace.php', 'randplace_settings');
-       unregister_hook('plugin_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
+       Addon::unregisterHook('post_local',    'addon/randplace/randplace.php', 'randplace_post_hook');
+       Addon::unregisterHook('addon_settings', 'addon/randplace/randplace.php', 'randplace_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
 
 
        logger("removed randplace");
@@ -73,7 +75,7 @@ function randplace_post_hook($a, &$item) {
         * An item was posted on the local system.
         * We are going to look for specific items:
         *      - A status post by a profile owner
-        *      - The profile owner must have allowed our plugin
+        *      - The profile owner must have allowed our addon
         *
         */
 
@@ -141,7 +143,7 @@ function randplace_settings_post($a,$post) {
 
 /**
  *
- * Called from the Plugin Setting form. 
+ * Called from the Addon Setting form.
  * Add our own settings info to the page.
  *
  */
@@ -166,14 +168,14 @@ function randplace_settings(&$a,&$s) {
        /* Add some HTML to the existing form */
 
        $s .= '<div class="settings-block">';
-       $s .= '<h3>' . t('Randplace Settings') . '</h3>';
+       $s .= '<h3>' . L10n::t('Randplace Settings') . '</h3>';
        $s .= '<div id="randplace-enable-wrapper">';
-       $s .= '<label id="randplace-enable-label" for="randplace-checkbox">' . t('Enable Randplace Plugin') . '</label>';
+       $s .= '<label id="randplace-enable-label" for="randplace-checkbox">' . L10n::t('Enable Randplace Addon') . '</label>';
        $s .= '<input id="randplace-checkbox" type="checkbox" name="randplace" value="1" ' . $checked . '/>';
        $s .= '</div><div class="clear"></div>';
 
        /* provide a submit button */
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="randplace-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="randplace-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
 }
index b9e385825af8c60d29cc8fd374b3fdef9a4506ee..33e106ce2a591b94dece766af2aaf8e3cea8fd9c 100644 (file)
@@ -1,8 +1,8 @@
-The Remote Permissions plugin enables recipients of private posts to see who else has received the post. This can be beneficial on community servers where people may want to modify the way they speak depending on who can see their comments to the post.
+The Remote Permissions addon enables recipients of private posts to see who else has received the post. This can be beneficial on community servers where people may want to modify the way they speak depending on who can see their comments to the post.
 
-Note that since Friendica is federated, the local hub may have posts that originated elsewhere. In that case, the plugin has no way of knowing all the recipients of the post, and it must settle for finding out who else can see it on the local hub.
+Note that since Friendica is federated, the local hub may have posts that originated elsewhere. In that case, the addon has no way of knowing all the recipients of the post, and it must settle for finding out who else can see it on the local hub.
 
-The hub admin can specify one of two behaviors for this plugin:
+The hub admin can specify one of two behaviors for this addon:
 
 * **Global:** every private post on the local hub will show all recipients (or at least the ones it can discover) of the post to any other users on the local hub
 * **Individual:** only private posts from those users on the local hub who "opt-in" will show the post recipients. None of the private posts that originated elsewhere will show even partial lists of post recipients
index 3cf40067fe44e6ee3da0bb9feb29a8480e701266..141059e65e7079179946241143b56d708ec4bfc9 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:23+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index 5cba005ab2848914837470239fddff1157bbaee5..b1651517408060f029fe3061a15248c7a5beddd3 100644 (file)
@@ -6,18 +6,21 @@
  * Author: Zach <https://f.shmuz.in/profile/techcity>
  * 
  */
-
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 function remote_permissions_install() {
-       register_hook('lockview_content', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_content');
-       register_hook('plugin_settings', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_settings');
-       register_hook('plugin_settings_post', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_settings_post');
+       Addon::registerHook('lockview_content', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_content');
+       Addon::registerHook('addon_settings', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_settings');
+       Addon::registerHook('addon_settings_post', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_settings_post');
 }
 
 function remote_permissions_uninstall() {
-       unregister_hook('lockview_content', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_content');
-       unregister_hook('plugin_settings', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_settings');
-       unregister_hook('plugin_settings_post', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_settings_post');
+       Addon::unregisterHook('lockview_content', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_content');
+       Addon::unregisterHook('addon_settings', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/remote_permissions/remote_permissions.php', 'remote_permissions_settings_post');
 }
 
 function remote_permissions_settings(&$a,&$o) {
@@ -41,12 +44,12 @@ function remote_permissions_settings(&$a,&$o) {
 
 //     $t = file_get_contents("addon/remote_permissions/settings.tpl" );
        $t = get_markup_template("settings.tpl", "addon/remote_permissions/" );
-       $o .= replace_macros($t, array(
-               '$remote_perms_title' => t('Remote Permissions Settings'),
-               '$remote_perms_label' => t('Allow recipients of your private posts to see the other recipients of the posts'),
+       $o .= replace_macros($t, [
+               '$remote_perms_title' => L10n::t('Remote Permissions Settings'),
+               '$remote_perms_label' => L10n::t('Allow recipients of your private posts to see the other recipients of the posts'),
                '$checked' => (($remote_perms == 1) ? 'checked="checked"' : ''),
-               '$submit' => t('Save Settings')
-       ));
+               '$submit' => L10n::t('Save Settings')
+       ]);
 
 }
 
@@ -54,8 +57,8 @@ function remote_permissions_settings_post($a,$post) {
        if(! local_user() || (! x($_POST,'remote-perms-submit')))
                return;
 
-       set_pconfig(local_user(),'remote_perms','show',intval($_POST['remote-perms']));
-       info( t('Remote Permissions settings updated.') . EOL);
+       PConfig::set(local_user(),'remote_perms','show',intval($_POST['remote-perms']));
+       info(L10n::t('Remote Permissions settings updated.') . EOL);
 }
 
 function remote_permissions_content($a, $item_copy) {
@@ -121,9 +124,9 @@ function remote_permissions_content($a, $item_copy) {
                        $deny_users = expand_acl($item['deny_cid']);
                        $deny_groups = expand_acl($item['deny_gid']);
 
-                       $o = t('Visible to:') . '<br />';
-                       $allow = array();
-                       $deny = array();
+                       $o = L10n::t('Visible to:') . '<br />';
+                       $allow = [];
+                       $deny = [];
 
                        if(count($allowed_groups)) {
                                $r = q("SELECT DISTINCT `contact-id` FROM group_member WHERE gid IN ( %s )",
@@ -175,7 +178,7 @@ function remote_permissions_content($a, $item_copy) {
                        if(! $r)
                                return;
 
-                       $o = t('Visible to') . ' (' . t('may only be a partial list') . '):<br />';
+                       $o = L10n::t('Visible to') . ' (' . L10n::t('may only be a partial list') . '):<br />';
 
                        foreach($r as $rr)
                                $allow_names[] = $rr['username'];
@@ -190,18 +193,17 @@ function remote_permissions_content($a, $item_copy) {
        return;
 }
 
-function remote_permissions_plugin_admin(&$a, &$o){
+function remote_permissions_addon_admin(&$a, &$o){
        $t = get_markup_template( "admin.tpl", "addon/remote_permissions/" );
-       $o = replace_macros($t, array(
-               '$submit' => t('Save Settings'),
-               '$global' => array('remotepermschoice', t('Global'), 1, t('The posts of every user on this server show the post recipients'),  get_config('remote_perms', 'global') == 1),
-               '$individual' => array('remotepermschoice', t('Individual'), 2, t('Each user chooses whether his/her posts show the post recipients'),  get_config('remote_perms', 'global') == 0)
-       ));
+       $o = replace_macros($t, [
+               '$submit' => L10n::t('Save Settings'),
+               '$global' => ['remotepermschoice', L10n::t('Global'), 1, L10n::t('The posts of every user on this server show the post recipients'),  Config::get('remote_perms', 'global') == 1],
+               '$individual' => ['remotepermschoice', L10n::t('Individual'), 2, L10n::t('Each user chooses whether his/her posts show the post recipients'),  Config::get('remote_perms', 'global') == 0]
+       ]);
 }
 
-function remote_permissions_plugin_admin_post(&$a){
+function remote_permissions_addon_admin_post(&$a){
        $choice =       ((x($_POST,'remotepermschoice'))                ? notags(trim($_POST['remotepermschoice']))     : '');
-       set_config('remote_perms','global',($choice == 1 ? 1 : 0));
-       info( t('Settings updated.'). EOL );
+       Config::set('remote_perms','global',($choice == 1 ? 1 : 0));
+       info(L10n::t('Settings updated.'). EOL);
 }
-
index 6c5c5dcea51d159d975175a350c46d1bfa8415c6..c16855c338309e7a005d367c8b44f4234a19bf33 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-09-10 14:32+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index 034fdec71d42bf2db2525a947e709792fa9cdf90..a638865a210e3aedc8137dd71454cd704cf8f2ee 100644 (file)
@@ -1,6 +1,4 @@
 <?php
-
-
 /**
  * Name: rendertime
  * Description: Shows the time that was needed to render the current page
@@ -8,15 +6,18 @@
  * Author: Michael Vvogel <http://pirati.ca/profile/heluecht>
  *
  */
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
 
 function rendertime_install() {
-       register_hook('page_end', 'addon/rendertime/rendertime.php', 'rendertime_page_end');
+       Addon::registerHook('page_end', 'addon/rendertime/rendertime.php', 'rendertime_page_end');
 }
 
 
 function rendertime_uninstall() {
-       unregister_hook('init_1', 'addon/rendertime/rendertime.php', 'rendertime_init_1');
-       unregister_hook('page_end', 'addon/rendertime/rendertime.php', 'rendertime_page_end');
+       Addon::unregisterHook('init_1', 'addon/rendertime/rendertime.php', 'rendertime_init_1');
+       Addon::unregisterHook('page_end', 'addon/rendertime/rendertime.php', 'rendertime_page_end');
 }
 
 function rendertime_init_1(&$a) {
@@ -30,20 +31,20 @@ function rendertime_page_end(&$a, &$o) {
        $ignored = in_array($a->module, $ignored_modules);
 
        if (is_site_admin() && ($_GET["mode"] != "minimal") && !$a->is_mobile && !$a->is_tablet && !$ignored) {
-               $o = $o.'<div class="renderinfo">'.sprintf(t("Database: %s/%s, Network: %s, Rendering: %s, Session: %s, I/O: %s, Other: %s, Total: %s"),
-                                               round($a->performance["database"] - $a->performance["database_write"], 3),
-                                               round($a->performance["database_write"], 3),
-                                               round($a->performance["network"], 2),
-                                               round($a->performance["rendering"], 2),
-                                               round($a->performance["parser"], 2),
-                                               round($a->performance["file"], 2),
-                                               round($duration - $a->performance["database"]
-                                                        - $a->performance["network"] - $a->performance["rendering"]
-                                                        - $a->performance["parser"] - $a->performance["file"], 2),
-                                               round($duration, 2)
-                                               //round($a->performance["markstart"], 3)
-                                               //round($a->performance["plugin"], 3)
-                                               )."</div>";
+               $o = $o.'<div class="renderinfo">'. L10n::t("Database: %s/%s, Network: %s, Rendering: %s, Session: %s, I/O: %s, Other: %s, Total: %s",
+                       round($a->performance["database"] - $a->performance["database_write"], 3),
+                       round($a->performance["database_write"], 3),
+                       round($a->performance["network"], 2),
+                       round($a->performance["rendering"], 2),
+                       round($a->performance["parser"], 2),
+                       round($a->performance["file"], 2),
+                       round($duration - $a->performance["database"]
+                                       - $a->performance["network"] - $a->performance["rendering"]
+                                       - $a->performance["parser"] - $a->performance["file"], 2),
+                       round($duration, 2)
+                       //round($a->performance["markstart"], 3)
+                       //round($a->performance["plugin"], 3)
+                       )."</div>";
 
                if (get_config("rendertime", "callstack")) {
                        $o .= "<pre>";
diff --git a/securemail/lang/de/messages.po b/securemail/lang/de/messages.po
new file mode 100644 (file)
index 0000000..7d06d3d
--- /dev/null
@@ -0,0 +1,55 @@
+# ADDON securemail
+# Copyright (C)
+# This file is distributed under the same license as the Friendica securemail addon package.
+# 
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-04-11 21:14+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Richard Zsemberi <rzsemberi@gmail.com>, 2018\n"
+"Language-Team: German (https://www.transifex.com/Friendica/teams/12172/de/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: de\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: securemail.php:53
+msgid "\"Secure Mail\" Settings"
+msgstr "\"Secure Mail\" Einstellungen"
+
+#: securemail.php:54
+msgid "Save Settings"
+msgstr "Einstellungen speichern"
+
+#: securemail.php:55 securemail.php:76
+msgid "Save and send test"
+msgstr "Abspeichern und Test Senden"
+
+#: securemail.php:56
+msgid "Enable Secure Mail"
+msgstr "Secure Mail aktivieren"
+
+#: securemail.php:57
+msgid "Public key"
+msgstr "Öffentlicher Schlüssel"
+
+#: securemail.php:57
+msgid "Your public PGP key, ascii armored format"
+msgstr "Dein öffentlicher PGP Schlüssel, im Ascii-Format"
+
+#: securemail.php:74
+msgid "Secure Mail Settings saved."
+msgstr "Secure Mail Einstellungen gespeichert."
+
+#: securemail.php:111
+msgid "Test email sent"
+msgstr "Test-Email gesendet"
+
+#: securemail.php:113
+msgid "There was an error sending the test email"
+msgstr "Es gab ein Fehler beim Senden der Test-Email"
diff --git a/securemail/lang/de/strings.php b/securemail/lang/de/strings.php
new file mode 100644 (file)
index 0000000..65767ef
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+if(! function_exists("string_plural_select_de")) {
+function string_plural_select_de($n){
+       return ($n != 1);;
+}}
+;
+$a->strings["\"Secure Mail\" Settings"] = "\"Secure Mail\" Einstellungen";
+$a->strings["Save Settings"] = "Einstellungen speichern";
+$a->strings["Save and send test"] = "Abspeichern und Test Senden";
+$a->strings["Enable Secure Mail"] = "Secure Mail aktivieren";
+$a->strings["Public key"] = "Öffentlicher Schlüssel";
+$a->strings["Your public PGP key, ascii armored format"] = "Dein öffentlicher PGP Schlüssel, im Ascii-Format";
+$a->strings["Secure Mail Settings saved."] = "Secure Mail Einstellungen gespeichert.";
+$a->strings["Test email sent"] = "Test-Email gesendet";
+$a->strings["There was an error sending the test email"] = "Es gab ein Fehler beim Senden der Test-Email";
diff --git a/securemail/lang/it/messages.po b/securemail/lang/it/messages.po
new file mode 100644 (file)
index 0000000..208bbc9
--- /dev/null
@@ -0,0 +1,55 @@
+# ADDON securemail
+# Copyright (C)
+# This file is distributed under the same license as the Friendica securemail addon package.
+# 
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-04-11 21:14+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: fabrixxm <fabrix.xm@gmail.com>, 2018\n"
+"Language-Team: Italian (https://www.transifex.com/Friendica/teams/12172/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: securemail.php:53
+msgid "\"Secure Mail\" Settings"
+msgstr "Impostazioni Secure Mail"
+
+#: securemail.php:54
+msgid "Save Settings"
+msgstr "Salva Impostazioni"
+
+#: securemail.php:55 securemail.php:76
+msgid "Save and send test"
+msgstr "Salva e invia mail di prova"
+
+#: securemail.php:56
+msgid "Enable Secure Mail"
+msgstr "Abilita Secure Mail"
+
+#: securemail.php:57
+msgid "Public key"
+msgstr "Chiave pubblica"
+
+#: securemail.php:57
+msgid "Your public PGP key, ascii armored format"
+msgstr "La tua chiave pubblica PGP, in formato ascii armored"
+
+#: securemail.php:74
+msgid "Secure Mail Settings saved."
+msgstr "Impostazioni Secure Mail salvate."
+
+#: securemail.php:111
+msgid "Test email sent"
+msgstr "Email di prova invata"
+
+#: securemail.php:113
+msgid "There was an error sending the test email"
+msgstr "Si è verificato un errore durante l'invio dell'email di prova"
diff --git a/securemail/lang/it/strings.php b/securemail/lang/it/strings.php
new file mode 100644 (file)
index 0000000..2435bfb
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+if(! function_exists("string_plural_select_it")) {
+function string_plural_select_it($n){
+       return ($n != 1);;
+}}
+;
+$a->strings["\"Secure Mail\" Settings"] = "Impostazioni Secure Mail";
+$a->strings["Save Settings"] = "Salva Impostazioni";
+$a->strings["Save and send test"] = "Salva e invia mail di prova";
+$a->strings["Enable Secure Mail"] = "Abilita Secure Mail";
+$a->strings["Public key"] = "Chiave pubblica";
+$a->strings["Your public PGP key, ascii armored format"] = "La tua chiave pubblica PGP, in formato ascii armored";
+$a->strings["Secure Mail Settings saved."] = "Impostazioni Secure Mail salvate.";
+$a->strings["Test email sent"] = "Email di prova invata";
+$a->strings["There was an error sending the test email"] = "Si è verificato un errore durante l'invio dell'email di prova";
index b20eab9c21edb1522f47bb914be511ab3927a85f..21ed28331d0dc27e09ce344824335d999efb5e19 100644 (file)
@@ -7,8 +7,10 @@
  */
 
 use Friendica\App;
-
-require_once 'include/Emailer.php';
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\Emailer;
 
 /* because the fraking openpgp-php is in composer, require libs in composer
  * and then don't use autoloader to load classes... */
@@ -23,19 +25,19 @@ require_once 'openpgp_crypt_symmetric.php';
 
 
 function securemail_install() {
-    register_hook('plugin_settings', 'addon/securemail/securemail.php', 'securemail_settings');
-    register_hook('plugin_settings_post', 'addon/securemail/securemail.php', 'securemail_settings_post');
+    Addon::registerHook('addon_settings', 'addon/securemail/securemail.php', 'securemail_settings');
+    Addon::registerHook('addon_settings_post', 'addon/securemail/securemail.php', 'securemail_settings_post');
 
-    register_hook('emailer_send_prepare', 'addon/securemail/securemail.php', 'securemail_emailer_send_prepare');
+    Addon::registerHook('emailer_send_prepare', 'addon/securemail/securemail.php', 'securemail_emailer_send_prepare');
 
     logger('installed securemail');
 }
 
 function securemail_uninstall() {
-    unregister_hook('plugin_settings', 'addon/securemail/securemail.php', 'securemail_settings');
-    unregister_hook('plugin_settings_post', 'addon/securemail/securemail.php', 'securemail_settings_post');
+    Addon::unregisterHook('addon_settings', 'addon/securemail/securemail.php', 'securemail_settings');
+    Addon::unregisterHook('addon_settings_post', 'addon/securemail/securemail.php', 'securemail_settings_post');
 
-    unregister_hook('emailer_send_prepare', 'addon/securemail/securemail.php', 'securemail_emailer_send_prepare');
+    Addon::unregisterHook('emailer_send_prepare', 'addon/securemail/securemail.php', 'securemail_emailer_send_prepare');
 
     logger('removed securemail');
 }
@@ -43,7 +45,7 @@ function securemail_uninstall() {
 /**
  * @brief Build user settings form
  *
- * @link https://github.com/friendica/friendica/blob/develop/doc/Plugins.md#plugin_settings 'plugin_settings' hook
+ * @link https://github.com/friendica/friendica/blob/develop/doc/Addons.md#addon_settings 'addon_settings' hook
  *
  * @param App $a App instance
  * @param string $s output html
@@ -60,19 +62,19 @@ function securemail_settings(App &$a, &$s){
 
     $t = get_markup_template('admin.tpl', 'addon/securemail/');
 
-    $s .= replace_macros($t, array(
-        '$title' => t('"Secure Mail" Settings'),
-        '$submit' => t('Save Settings'),
-        '$test' => t('Save and send test'), //NOTE: update also in 'post'
-        '$enable' => array('securemail-enable', t('Enable Secure Mail'), $enable, ''),
-        '$publickey' => array('securemail-pkey', t('Public key'), $publickey, t('Your public PGP key, ascii armored format'), 'rows="10"')
-    ));
+    $s .= replace_macros($t, [
+        '$title' => L10n::t('"Secure Mail" Settings'),
+        '$submit' => L10n::t('Save Settings'),
+        '$test' => L10n::t('Save and send test'), //NOTE: update also in 'post'
+        '$enable' => ['securemail-enable', L10n::t('Enable Secure Mail'), $enable, ''],
+        '$publickey' => ['securemail-pkey', L10n::t('Public key'), $publickey, L10n::t('Your public PGP key, ascii armored format'), 'rows="10"']
+    ]);
 }
 
 /**
  * @brief Handle data from user settings form
  *
- * @link https://github.com/friendica/friendica/blob/develop/doc/Plugins.md#plugin_settings_post 'plugin_settings_post' hook
+ * @link https://github.com/friendica/friendica/blob/develop/doc/Addons.md#addon_settings_post 'addon_settings_post' hook
  *
  * @param App $a App instance
  * @param array $b hook data
@@ -88,10 +90,10 @@ function securemail_settings_post(App &$a, array &$b){
     if ($_POST['securemail-submit']) {
         set_pconfig(local_user(), 'securemail', 'pkey', trim($_POST['securemail-pkey']));
         $enable = ((x($_POST, 'securemail-enable')) ? 1 : 0);
-        set_pconfig(local_user(), 'securemail', 'enable', $enable);
-        info(t('Secure Mail Settings saved.') . EOL);
+        PConfig::set(local_user(), 'securemail', 'enable', $enable);
+        info(L10n::t('Secure Mail Settings saved.') . EOL);
 
-        if ($_POST['securemail-submit'] == t('Save and send test')) {
+        if ($_POST['securemail-submit'] == L10n::t('Save and send test')) {
             $sitename = $a->config['sitename'];
 
             $hostname = $a->get_hostname();
@@ -126,9 +128,9 @@ function securemail_settings_post(App &$a, array &$b){
             set_pconfig(local_user(), 'securemail', 'enable', $enable);
 
             if ($res) {
-                info(t('Test email sent') . EOL);
+                info(L10n::t('Test email sent') . EOL);
             } else {
-                notice(t('There was an error sending the test email') . EOL);
+                notice(L10n::t('There was an error sending the test email') . EOL);
             }
         }
     }
@@ -137,7 +139,7 @@ function securemail_settings_post(App &$a, array &$b){
 /**
  * @brief Encrypt notification emails text
  *
- * @link https://github.com/friendica/friendica/blob/develop/doc/Plugins.md#emailer_send_prepare 'emailer_send_prepare' hook
+ * @link https://github.com/friendica/friendica/blob/develop/doc/Addons.md#emailer_send_prepare 'emailer_send_prepare' hook
  *
  * @param App $a App instance
  * @param array $b hook data
index 5d15f7bfa673b3583399f4e282a0b2092a300974..1a5655404566d8f2e4465742e67b35308e094e42 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:23+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index a9d8334f3e41dea7532d2df1d11599cf95fb2a70..d3753e6fdc1340b3d4c3f26974195d3e8b9a93b0 100644 (file)
@@ -7,17 +7,20 @@
  *         based upon NSFW from Mike Macgirvin <http://macgirvin.com/profile/mike>
  *
  */
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 function showmore_install() {
-       register_hook('prepare_body', 'addon/showmore/showmore.php', 'showmore_prepare_body');
-       register_hook('plugin_settings', 'addon/showmore/showmore.php', 'showmore_addon_settings');
-       register_hook('plugin_settings_post', 'addon/showmore/showmore.php', 'showmore_addon_settings_post');
+       Addon::registerHook('prepare_body', 'addon/showmore/showmore.php', 'showmore_prepare_body');
+       Addon::registerHook('addon_settings', 'addon/showmore/showmore.php', 'showmore_addon_settings');
+       Addon::registerHook('addon_settings_post', 'addon/showmore/showmore.php', 'showmore_addon_settings_post');
 }
 
 function showmore_uninstall() {
-       unregister_hook('prepare_body', 'addon/showmore/showmore.php', 'showmore_prepare_body');
-       unregister_hook('plugin_settings', 'addon/showmore/showmore.php', 'showmore_addon_settings');
-       unregister_hook('plugin_settings_post', 'addon/showmore/showmore.php', 'showmore_addon_settings_post');
+       Addon::unregisterHook('prepare_body', 'addon/showmore/showmore.php', 'showmore_prepare_body');
+       Addon::unregisterHook('addon_settings', 'addon/showmore/showmore.php', 'showmore_addon_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/showmore/showmore.php', 'showmore_addon_settings_post');
 }
 
 function showmore_addon_settings(&$a,&$s) {
@@ -35,24 +38,24 @@ function showmore_addon_settings(&$a,&$s) {
                $chars = '1100';
 
        $s .= '<span id="settings_showmore_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_showmore_expanded\'); openClose(\'settings_showmore_inflated\');">';
-       $s .= '<h3>' . t('"Show more" Settings').'</h3>';
+       $s .= '<h3>' . L10n::t('"Show more" Settings').'</h3>';
        $s .= '</span>';
        $s .= '<div id="settings_showmore_expanded" class="settings-block" style="display: none;">';
        $s .= '<span class="fakelink" onclick="openClose(\'settings_showmore_expanded\'); openClose(\'settings_showmore_inflated\');">';
-       $s .= '<h3>' . t('"Show more" Settings').'</h3>';
+       $s .= '<h3>' . L10n::t('"Show more" Settings').'</h3>';
        $s .= '</span>';
 
        $s .= '<div id="showmore-wrapper">';
 
-       $s .= '<label id="showmore-enable-label" for="showmore-enable">'.t('Enable Show More').'</label>';
+       $s .= '<label id="showmore-enable-label" for="showmore-enable">'.L10n::t('Enable Show More').'</label>';
        $s .= '<input id="showmore-enable" type="checkbox" name="showmore-enable" value="1"'.$enable_checked.' />';
        $s .= '<div class="clear"></div>';
-       $s .= '<label id="showmore-label" for="showmore-chars">'.t('Cutting posts after how much characters').' </label>';
+       $s .= '<label id="showmore-label" for="showmore-chars">'.L10n::t('Cutting posts after how much characters').' </label>';
        $s .= '<input id="showmore-words" type="text" name="showmore-chars" value="'.$chars.'" />';
        $s .= '</div><div class="clear"></div>';
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="showmore-submit" name="showmore-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
-//     $s .= '<div class="showmore-desc">' . t('Use /expression/ to provide regular expressions') . '</div>';
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="showmore-submit" name="showmore-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
+//     $s .= '<div class="showmore-desc">' . L10n::t('Use /expression/ to provide regular expressions') . '</div>';
        $s .= '</div>';
 
        return;
@@ -67,8 +70,8 @@ function showmore_addon_settings_post(&$a,&$b) {
                set_pconfig(local_user(),'showmore','chars',trim($_POST['showmore-chars']));
                $enable = ((x($_POST,'showmore-enable')) ? intval($_POST['showmore-enable']) : 0);
                $disable = 1-$enable;
-               set_pconfig(local_user(),'showmore','disable', $disable);
-               info( t('Show More Settings saved.') . EOL);
+               PConfig::set(local_user(),'showmore','disable', $disable);
+               info(L10n::t('Show More Settings saved.') . EOL);
        }
 }
 
@@ -122,7 +125,7 @@ function showmore_prepare_body(&$a,&$b) {
        if($found) {
                $rnd = random_string(8);
                $b['html'] = '<span id="showmore-teaser-'.$rnd.'" class="showmore-teaser" style="display: block;">'.$shortened." ".
-                               '<span id="showmore-wrap-'.$rnd.'" style="white-space:nowrap;" class="showmore-wrap fakelink" onclick="openClose(\'showmore-'.$rnd.'\'); openClose(\'showmore-teaser-'.$rnd.'\');" >'.sprintf(t('show more')).'</span></span>'.
+                               '<span id="showmore-wrap-'.$rnd.'" style="white-space:nowrap;" class="showmore-wrap fakelink" onclick="openClose(\'showmore-'.$rnd.'\'); openClose(\'showmore-teaser-'.$rnd.'\');" >'.L10n::t('show more').'</span></span>'.
                                '<div id="showmore-'.$rnd.'" class="showmore-content" style="display: none;">'.$b['html'].'</div>';
        }
 }
index fb4bce1321300475e77cc709758a6edb096603f5..4756638002b5c1ac049725620623163d986e261e 100644 (file)
@@ -6,17 +6,14 @@
  * Author: Thomas Willingham (based on Mike Macgirvin's Adult Smile template) 
  * All smileys from sites offering them as Public Domain
  */
-
-/**
-
-*/
+use Friendica\Core\Addon;
 
 function smiley_pack_es_install() {
-       register_hook('smilie', 'addon/smiley_pack_es/smiley_pack_es.php', 'smiley_pack_smilies_es');
+       Addon::registerHook('smilie', 'addon/smiley_pack_es/smiley_pack_es.php', 'smiley_pack_smilies_es');
 }
 
 function smiley_pack_es_uninstall() {
-       unregister_hook('smilie', 'addon/smiley_pack_es/smiley_pack_es.php', 'smiley_pack_smilies');
+       Addon::unregisterHook('smilie', 'addon/smiley_pack_es/smiley_pack_es.php', 'smiley_pack_smilies');
 }
 
  
index 3ae70879cb58ba7a24831f36b00be39331dac3e1..282c0dde07ae8743527cf6946fe6da09059da182 100644 (file)
@@ -8,13 +8,14 @@
  * 
  * 
  */
+use Friendica\Core\Addon;
 
 function smiley_pack_fr_install() {
-       register_hook('smilie', 'addon/smiley_pack_fr/smiley_pack_fr.php', 'smiley_pack_fr_smilies');
+       Addon::registerHook('smilie', 'addon/smiley_pack_fr/smiley_pack_fr.php', 'smiley_pack_fr_smilies');
 }
 
 function smiley_pack_fr_uninstall() {
-       unregister_hook('smilie', 'addon/smiley_pack_fr/smiley_pack_fr.php', 'smiley_pack_fr_smilies');
+       Addon::unregisterHook('smilie', 'addon/smiley_pack_fr/smiley_pack_fr.php', 'smiley_pack_fr_smilies');
 }
 
  
index 4d49b7c0275c2b5a74237553a49ebc0f83f47140..ea3490ebb3bbe21a92d63702af13bbcaea78675a 100644 (file)
@@ -7,16 +7,14 @@
  * All smileys from sites offering them as Public Domain
  */
 
-/**
-
-*/
+use Friendica\Core\Addon;
 
 function smiley_pack_install() {
-       register_hook('smilie', 'addon/smiley_pack/smiley_pack.php', 'smiley_pack_smilies');
+       Addon::registerHook('smilie', 'addon/smiley_pack/smiley_pack.php', 'smiley_pack_smilies');
 }
 
 function smiley_pack_uninstall() {
-       unregister_hook('smilie', 'addon/smiley_pack/smiley_pack.php', 'smiley_pack_smilies');
+       Addon::unregisterHook('smilie', 'addon/smiley_pack/smiley_pack.php', 'smiley_pack_smilies');
 }
 
  
index e3bbf4feadca4b6e472d930a4c1439f02927aaf3..1a1f20de83cb902fdc1987a53b363879c9978354 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-06-23 14:45+0200\n"
-"PO-Revision-Date: 2014-09-10 14:33+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index d8c1533024704673b0ce5534d9d475e427912b4b..7c5e84f92e816215e5f6b564587a9494f6c36502 100644 (file)
@@ -5,19 +5,19 @@
  * Version: 0.2
  * Author: Johannes Schwab <https://friendica.jschwab.org/profile/ddorian>
  */
-
+use Friendica\Core\Addon;
 
 function smileybutton_install() {
-       //Register hooks 
-       register_hook('jot_tool', 'addon/smileybutton/smileybutton.php', 'show_button');
+       //Register hooks
+       Addon::registerHook('jot_tool', 'addon/smileybutton/smileybutton.php', 'show_button');
+
        logger("installed smileybutton");
 }
 
 
 function smileybutton_uninstall() {
        //Delet registered hooks
-       unregister_hook('jot_tool',    'addon/smileybutton/smileybutton.php', 'show_button');   
+       Addon::unregisterHook('jot_tool',    'addon/smileybutton/smileybutton.php', 'show_button');
 
        logger("removed smileybutton");
 }
@@ -95,8 +95,8 @@ function show_button($a, &$b) {
        );
        
        // Call hooks to get aditional smileies from other addons
-       $params = array('texts' => $texts, 'icons' => $icons, 'string' => ""); //changed
-       call_hooks('smilie', $params);
+       $params = ['texts' => $texts, 'icons' => $icons, 'string' => ""]; //changed
+       Addon::callHooks('smilie', $params);
 
        //Generate html for smiley list
        $s = "<table class=\"smiley-preview\"><tr>\n\t";
index 82b30a9807e84785d8316020c0c7de6d7c5d5e04..bb673f23de8ddfe14f46f4d45d2c83b59ed41cfd 100644 (file)
@@ -8,13 +8,14 @@
  * This is a template for how to extend the "smily" code.
  * 
  */
+use Friendica\Core\Addon;
 
 function smilies_adult_install() {
-       register_hook('smilie', 'addon/smilies_adult/smilies_adult.php', 'smilies_adult_smilies');
+       Addon::registerHook('smilie', 'addon/smilies_adult/smilies_adult.php', 'smilies_adult_smilies');
 }
 
 function smilies_adult_uninstall() {
-       unregister_hook('smilie', 'addon/smilies_adult/smilies_adult.php', 'smilies_adult_smilies');
+       Addon::unregisterHook('smilie', 'addon/smilies_adult/smilies_adult.php', 'smilies_adult_smilies');
 }
 
  
index 59812cba06be0372a0c102f397cba64d92c13942..ffebedb3031e70749174290cb294fd18c1d97446 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Demo plugin for adding various types of Flash games to Friendica.
+ * Demo addon for adding various types of Flash games to Friendica.
  * In this case we're using "Hot Shot Sniper" by FlashGames247
  *
  * Name: Sniper
@@ -9,14 +9,14 @@
  * Version: 1.0
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
  */
-
+use Friendica\Core\Addon;
 
 function sniper_install() {
-    register_hook('app_menu', 'addon/sniper/sniper.php', 'sniper_app_menu');
+    Addon::registerHook('app_menu', 'addon/sniper/sniper.php', 'sniper_app_menu');
 }
 
 function sniper_uninstall() {
-    unregister_hook('app_menu', 'addon/sniper/sniper.php', 'sniper_app_menu');
+    Addon::unregisterHook('app_menu', 'addon/sniper/sniper.php', 'sniper_app_menu');
 
 }
 
index 4aafd114451bbab9a2f17e2400ad7ba300e7a791..3d57290034fae1ecc6b14439de7f4a70ef2a4a72 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:27+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index e0d822ac27594dfb83f85f70930ccc1552c57b39..a70e657397e9477d2f56a334d5eca6cc2c7a5218 100644 (file)
@@ -6,19 +6,21 @@
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
  * 
  */
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 function startpage_install() {
-       register_hook('home_init', 'addon/startpage/startpage.php', 'startpage_home_init');
-       register_hook('plugin_settings', 'addon/startpage/startpage.php', 'startpage_settings');
-       register_hook('plugin_settings_post', 'addon/startpage/startpage.php', 'startpage_settings_post');
+       Addon::registerHook('home_init', 'addon/startpage/startpage.php', 'startpage_home_init');
+       Addon::registerHook('addon_settings', 'addon/startpage/startpage.php', 'startpage_settings');
+       Addon::registerHook('addon_settings_post', 'addon/startpage/startpage.php', 'startpage_settings_post');
 }
 
 
 function startpage_uninstall() {
-       unregister_hook('home_init', 'addon/startpage/startpage.php', 'startpage_home_init');
-       unregister_hook('plugin_settings', 'addon/startpage/startpage.php', 'startpage_settings');
-       unregister_hook('plugin_settings_post', 'addon/startpage/startpage.php', 'startpage_settings_post');
+       Addon::unregisterHook('home_init', 'addon/startpage/startpage.php', 'startpage_home_init');
+       Addon::unregisterHook('addon_settings', 'addon/startpage/startpage.php', 'startpage_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/startpage/startpage.php', 'startpage_settings_post');
 }
 
 
@@ -53,16 +55,12 @@ function startpage_settings_post($a,$post) {
                set_pconfig(local_user(),'startpage','startpage',strip_tags(trim($_POST['startpage'])));
 }
 
-
 /**
  *
- * Called from the Plugin Setting form. 
+ * Called from the Addon Setting form.
  * Add our own settings info to the page.
  *
  */
-
-
-
 function startpage_settings(&$a,&$s) {
 
        if(! local_user())
@@ -80,20 +78,20 @@ function startpage_settings(&$a,&$s) {
        /* Add some HTML to the existing form */
 
        $s .= '<span id="settings_startpage_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_startpage_expanded\'); openClose(\'settings_startpage_inflated\');">';
-       $s .= '<h3>' . t('Startpage') . '</h3>';
+       $s .= '<h3>' . L10n::t('Startpage') . '</h3>';
        $s .= '</span>';
        $s .= '<div id="settings_startpage_expanded" class="settings-block" style="display: none;">';
        $s .= '<span class="fakelink" onclick="openClose(\'settings_startpage_expanded\'); openClose(\'settings_startpage_inflated\');">';
-       $s .= '<h3>' . t('Startpage') . '</h3>';
+       $s .= '<h3>' . L10n::t('Startpage') . '</h3>';
        $s .= '</span>';
        $s .= '<div id="startpage-page-wrapper">';
-       $s .= '<label id="startpage-page-label" for="startpage-page">' . t('Home page to load after login  - leave blank for profile wall') . '</label>';
+       $s .= '<label id="startpage-page-label" for="startpage-page">' . L10n::t('Home page to load after login  - leave blank for profile wall') . '</label>';
        $s .= '<input id="startpage-page" type="text" name="startpage" value="' . $page . '" />';
        $s .= '</div><div class="clear"></div>';
-       $s .= '<div id="startpage-desc">' . t('Examples: &quot;network&quot; or &quot;notifications/system&quot;') . '</div>';
+       $s .= '<div id="startpage-desc">' . L10n::t('Examples: &quot;network&quot; or &quot;notifications/system&quot;') . '</div>';
 
        /* provide a submit button */
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="startpage-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="startpage-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
 }
index 5042e413ea74bb4a186bf5b27918f889395cfb04..0f246750d883574a6c399e11e7fa6765885d9193 100644 (file)
@@ -12,7 +12,7 @@ Requirements
 Due to the distributed nature of the GNU Social network, each user who wishes to
 forward public messages to a GNU Social account has to get the OAuth credentials
 for themselves, which makes this addon a little bit more user unfriendly than
-the Twitter Plugin is. Nothing too geeky though!
+the Twitter Addon is. Nothing too geeky though!
 
 The inclusion of a shorturl for the original posting in cases when the message
 was longer than the maximal allowed notice length requires it, that you have
@@ -57,9 +57,9 @@ During the registration of the OAuth client remember the following:
 After the required credentials for the application are stored in the
 configuration you have to actually connect your friendica account with
 GNU Social. To do so follow the Sign in with GNU Social button, allow the access
-and copy the security code into the plugin configuration. Friendica will then
+and copy the security code into the addon configuration. Friendica will then
 try to acquire the final OAuth credentials from the API, if successful the
-plugin settings will allow you to select to post your public messages to your
+addon settings will allow you to select to post your public messages to your
 GNU Social account.
 
 License
diff --git a/statusnet/codebird.php b/statusnet/codebird.php
deleted file mode 100644 (file)
index cba5f93..0000000
+++ /dev/null
@@ -1,1057 +0,0 @@
-<?php
-
-namespace CodebirdSN;
-
-/**
- * A Twitter library in PHP.
- *
- * @package codebird
- * @version 2.4.1
- * @author J.M. <me@mynetx.net>
- * @copyright 2010-2013 J.M. <me@mynetx.net>
- *
- * Modified for statusnet by Michael Vogel <heluecht@pirati.ca>
- *
- * 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/>.
- */
-
-/**
- * Define constants
- */
-$constants = explode(' ', 'OBJECT ARRAY JSON');
-foreach ($constants as $i => $id) {
-    $id = 'CODEBIRD_RETURNFORMAT_' . $id;
-    defined($id) or define($id, $i);
-}
-$constants = array(
-    'CURLE_SSL_CERTPROBLEM' => 58,
-    'CURLE_SSL_CACERT' => 60,
-    'CURLE_SSL_CACERT_BADFILE' => 77,
-    'CURLE_SSL_CRL_BADFILE' => 82,
-    'CURLE_SSL_ISSUER_ERROR' => 83
-);
-foreach ($constants as $id => $i) {
-    defined($id) or define($id, $i);
-}
-unset($constants);
-unset($i);
-unset($id);
-
-/**
- * A Twitter library in PHP.
- *
- * @package codebird
- * @subpackage codebird-php
- */
-class CodebirdSN
-{
-    /**
-     * The current singleton instance
-     */
-    private static $_instance = null;
-
-    /**
-     * The OAuth consumer key of your registered app
-     */
-    protected static $_oauth_consumer_key = null;
-
-    /**
-     * The corresponding consumer secret
-     */
-    protected static $_oauth_consumer_secret = null;
-
-    /**
-     * The app-only bearer token. Used to authorize app-only requests
-     */
-    protected static $_oauth_bearer_token = null;
-
-    /**
-     * The API endpoint to use
-     */
-    protected static $_endpoint = 'https://api.twitter.com/1.1/';
-
-    /**
-     * The API endpoint to use for OAuth requests
-     */
-    protected static $_endpoint_oauth = 'https://api.twitter.com/';
-
-    /**
-     * The Request or access token. Used to sign requests
-     */
-    protected $_oauth_token = null;
-
-    /**
-     * The corresponding request or access token secret
-     */
-    protected $_oauth_token_secret = null;
-
-    /**
-     * The format of data to return from API calls
-     */
-    protected $_return_format = CODEBIRD_RETURNFORMAT_OBJECT;
-
-    /**
-     * The file formats that Twitter accepts as image uploads
-     */
-    protected $_supported_media_files = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG);
-
-    /**
-     * The current Codebird version
-     */
-    protected $_version = '2.4.1';
-
-    /**
-     * Returns singleton class instance
-     * Always use this method unless you're working with multiple authenticated users at once
-     *
-     * @return Codebird The instance
-     */
-    public static function getInstance()
-    {
-        if (self::$_instance == null) {
-            self::$_instance = new self;
-        }
-        return self::$_instance;
-    }
-
-    /**
-     * Sets the API endpoint
-     *
-     * @param string $api    API endpoint
-     *
-     * @return void
-     */
-    public static function setAPIEndpoint($api)
-    {
-        self::$_endpoint_oauth = $api;
-        self::$_endpoint       = $api;
-    }
-
-    /**
-     * Sets the OAuth consumer key and secret (App key)
-     *
-     * @param string $key    OAuth consumer key
-     * @param string $secret OAuth consumer secret
-     *
-     * @return void
-     */
-    public static function setConsumerKey($key, $secret)
-    {
-        self::$_oauth_consumer_key    = $key;
-        self::$_oauth_consumer_secret = $secret;
-    }
-
-    /**
-     * Sets the OAuth2 app-only auth bearer token
-     *
-     * @param string $token OAuth2 bearer token
-     *
-     * @return void
-     */
-    public static function setBearerToken($token)
-    {
-        self::$_oauth_bearer_token = $token;
-    }
-
-    /**
-     * Gets the current Codebird version
-     *
-     * @return string The version number
-     */
-    public function getVersion()
-    {
-        return $this->_version;
-    }
-
-    /**
-     * Sets the OAuth request or access token and secret (User key)
-     *
-     * @param string $token  OAuth request or access token
-     * @param string $secret OAuth request or access token secret
-     *
-     * @return void
-     */
-    public function setToken($token, $secret)
-    {
-        $this->_oauth_token        = $token;
-        $this->_oauth_token_secret = $secret;
-    }
-
-    /**
-     * Sets the format for API replies
-     *
-     * @param int $return_format One of these:
-     *                           CODEBIRD_RETURNFORMAT_OBJECT (default)
-     *                           CODEBIRD_RETURNFORMAT_ARRAY
-     *
-     * @return void
-     */
-    public function setReturnFormat($return_format)
-    {
-        $this->_return_format = $return_format;
-    }
-
-    /**
-     * Main API handler working on any requests you issue
-     *
-     * @param string $fn    The member function you called
-     * @param array $params The parameters you sent along
-     *
-     * @return mixed The API reply encoded in the set return_format
-     */
-
-    public function __call($fn, $params)
-    {
-        // parse parameters
-        $apiparams = array();
-        if (count($params) > 0) {
-            if (is_array($params[0])) {
-                $apiparams = $params[0];
-            } else {
-                parse_str($params[0], $apiparams);
-                // remove auto-added slashes if on magic quotes steroids
-                if (get_magic_quotes_gpc()) {
-                    foreach($apiparams as $key => $value) {
-                        if (is_array($value)) {
-                            $apiparams[$key] = array_map('stripslashes', $value);
-                        } else {
-                            $apiparams[$key] = stripslashes($value);
-                        }
-                    }
-                }
-            }
-        }
-
-        // stringify null and boolean parameters
-        foreach ($apiparams as $key => $value) {
-            if (! is_scalar($value)) {
-                continue;
-            }
-            if (is_null($value)) {
-                $apiparams[$key] = 'null';
-            } elseif (is_bool($value)) {
-                $apiparams[$key] = $value ? 'true' : 'false';
-            }
-        }
-
-        $app_only_auth = false;
-        if (count($params) > 1) {
-            $app_only_auth = !! $params[1];
-        }
-
-        // map function name to API method
-        $method = '';
-
-        // replace _ by /
-        $path = explode('_', $fn);
-        for ($i = 0; $i < count($path); $i++) {
-            if ($i > 0) {
-                $method .= '/';
-            }
-            $method .= $path[$i];
-        }
-        // undo replacement for URL parameters
-        $url_parameters_with_underscore = array('screen_name');
-        foreach ($url_parameters_with_underscore as $param) {
-            $param = strtoupper($param);
-            $replacement_was = str_replace('_', '/', $param);
-            $method = str_replace($replacement_was, $param, $method);
-        }
-
-        // replace AA by URL parameters
-        $method_template = $method;
-        $match   = array();
-        if (preg_match('/[A-Z_]{2,}/', $method, $match)) {
-            foreach ($match as $param) {
-                $param_l = strtolower($param);
-                $method_template = str_replace($param, ':' . $param_l, $method_template);
-                if (!isset($apiparams[$param_l])) {
-                    for ($i = 0; $i < 26; $i++) {
-                        $method_template = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method_template);
-                    }
-                    throw new \Exception(
-                        'To call the templated method "' . $method_template
-                        . '", specify the parameter value for "' . $param_l . '".'
-                    );
-                }
-                $method  = str_replace($param, $apiparams[$param_l], $method);
-                unset($apiparams[$param_l]);
-            }
-        }
-
-        // replace A-Z by _a-z
-        for ($i = 0; $i < 26; $i++) {
-            $method  = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method);
-            $method_template = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method_template);
-        }
-
-        $httpmethod = $this->_detectMethod($method_template, $apiparams);
-        $multipart  = $this->_detectMultipart($method_template);
-        return $this->_callApi(
-            $httpmethod,
-            $method,
-            $method_template,
-            $apiparams,
-            $multipart,
-            $app_only_auth
-        );
-    }
-
-    /**
-     * Uncommon API methods
-     */
-
-    /**
-     * Gets the OAuth authenticate URL for the current request token
-     *
-     * @return string The OAuth authenticate URL
-     */
-    public function oauth_authenticate($force_login = NULL, $screen_name = NULL)
-    {
-        if ($this->_oauth_token == null) {
-            throw new \Exception('To get the authenticate URL, the OAuth token must be set.');
-        }
-        $url = self::$_endpoint_oauth . 'oauth/authenticate?oauth_token=' . $this->_url($this->_oauth_token);
-        if ($force_login) {
-            $url .= "&force_login=1";
-        }
-        if ($screen_name) {
-            $url .= "&screen_name=" . $screen_name;
-        }
-        return $url;
-    }
-
-    /**
-     * Gets the OAuth authorize URL for the current request token
-     *
-     * @return string The OAuth authorize URL
-     */
-    public function oauth_authorize($force_login = NULL, $screen_name = NULL)
-    {
-        if ($this->_oauth_token == null) {
-            throw new \Exception('To get the authorize URL, the OAuth token must be set.');
-        }
-        $url = self::$_endpoint_oauth . 'oauth/authorize?oauth_token=' . $this->_url($this->_oauth_token);
-        if ($force_login) {
-            $url .= "&force_login=1";
-        }
-        if ($screen_name) {
-            $url .= "&screen_name=" . $screen_name;
-        }
-        return $url;
-    }
-
-    /**
-     * Gets the OAuth bearer token
-     *
-     * @return string The OAuth bearer token
-     */
-
-    public function oauth2_token()
-    {
-        if (! function_exists('curl_init')) {
-            throw new \Exception('To make API requests, the PHP curl extension must be available.');
-        }
-        if (self::$_oauth_consumer_key == null) {
-            throw new \Exception('To obtain a bearer token, the consumer key must be set.');
-        }
-        $ch  = false;
-        $post_fields = array(
-            'grant_type' => 'client_credentials'
-        );
-        $url = self::$_endpoint_oauth . 'oauth2/token';
-        $ch = curl_init($url);
-        curl_setopt($ch, CURLOPT_POST, 1);
-        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
-        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
-        curl_setopt($ch, CURLOPT_HEADER, 1);
-        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
-        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
-        //curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem');
-
-        curl_setopt($ch, CURLOPT_USERPWD, self::$_oauth_consumer_key . ':' . self::$_oauth_consumer_secret);
-        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
-            'Expect:'
-        ));
-        $reply = curl_exec($ch);
-
-        // certificate validation results
-        //$validation_result = curl_errno($ch);
-        //if (in_array(
-        //        $validation_result,
-        //        array(
-        //            CURLE_SSL_CERTPROBLEM,
-        //            CURLE_SSL_CACERT,
-        //            CURLE_SSL_CACERT_BADFILE,
-        //            CURLE_SSL_CRL_BADFILE,
-        //            CURLE_SSL_ISSUER_ERROR
-        //        )
-        //    )
-        //) {
-        //    throw new \Exception('Error ' . $validation_result . ' while validating the Twitter API certificate.');
-        //}
-
-        $httpstatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
-        $reply = $this->_parseApiReply('oauth2/token', $reply);
-        switch ($this->_return_format) {
-            case CODEBIRD_RETURNFORMAT_ARRAY:
-                $reply['httpstatus'] = $httpstatus;
-                if ($httpstatus == 200) {
-                    self::setBearerToken($reply['access_token']);
-                }
-                break;
-            case CODEBIRD_RETURNFORMAT_JSON:
-                if ($httpstatus == 200) {
-                    $parsed = json_decode($reply);
-                    self::setBearerToken($parsed->access_token);
-                }
-                break;
-            case CODEBIRD_RETURNFORMAT_OBJECT:
-                $reply->httpstatus = $httpstatus;
-                if ($httpstatus == 200) {
-                    self::setBearerToken($reply->access_token);
-                }
-                break;
-        }
-        return $reply;
-    }
-
-    /**
-     * Signing helpers
-     */
-
-    /**
-     * URL-encodes the given data
-     *
-     * @param mixed $data
-     *
-     * @return mixed The encoded data
-     */
-    private function _url($data)
-    {
-        if (is_array($data)) {
-            return array_map(array(
-                $this,
-                '_url'
-            ), $data);
-        } elseif (is_scalar($data)) {
-            return str_replace(array(
-                '+',
-                '!',
-                '*',
-                "'",
-                '(',
-                ')'
-            ), array(
-                ' ',
-                '%21',
-                '%2A',
-                '%27',
-                '%28',
-                '%29'
-            ), rawurlencode($data));
-        } else {
-            return '';
-        }
-    }
-
-    /**
-     * Gets the base64-encoded SHA1 hash for the given data
-     *
-     * @param string $data The data to calculate the hash from
-     *
-     * @return string The hash
-     */
-    private function _sha1($data)
-    {
-        if (self::$_oauth_consumer_secret == null) {
-            throw new \Exception('To generate a hash, the consumer secret must be set.');
-        }
-        if (!function_exists('hash_hmac')) {
-            throw new \Exception('To generate a hash, the PHP hash extension must be available.');
-        }
-        return base64_encode(hash_hmac('sha1', $data, self::$_oauth_consumer_secret . '&'
-            . ($this->_oauth_token_secret != null ? $this->_oauth_token_secret : ''), true));
-    }
-
-    /**
-     * Generates a (hopefully) unique random string
-     *
-     * @param int optional $length The length of the string to generate
-     *
-     * @return string The random string
-     */
-    protected function _nonce($length = 8)
-    {
-        if ($length < 1) {
-            throw new \Exception('Invalid nonce length.');
-        }
-        return substr(md5(microtime(true)), 0, $length);
-    }
-
-    /**
-     * Generates an OAuth signature
-     *
-     * @param string          $httpmethod Usually either 'GET' or 'POST' or 'DELETE'
-     * @param string          $method     The API method to call
-     * @param array  optional $params     The API call parameters, associative
-     *
-     * @return string Authorization HTTP header
-     */
-    protected function _sign($httpmethod, $method, $params = array())
-    {
-        if (self::$_oauth_consumer_key == null) {
-            throw new \Exception('To generate a signature, the consumer key must be set.');
-        }
-        $sign_params      = array(
-            'consumer_key' => self::$_oauth_consumer_key,
-            'version' => '1.0',
-            'timestamp' => time(),
-            'nonce' => $this->_nonce(),
-            'signature_method' => 'HMAC-SHA1'
-        );
-        $sign_base_params = array();
-        foreach ($sign_params as $key => $value) {
-            $sign_base_params['oauth_' . $key] = $this->_url($value);
-        }
-        if ($this->_oauth_token != null) {
-            $sign_base_params['oauth_token'] = $this->_url($this->_oauth_token);
-        }
-        $oauth_params = $sign_base_params;
-        foreach ($params as $key => $value) {
-            $sign_base_params[$key] = $this->_url($value);
-        }
-        ksort($sign_base_params);
-        $sign_base_string = '';
-        foreach ($sign_base_params as $key => $value) {
-            $sign_base_string .= $key . '=' . $value . '&';
-        }
-        $sign_base_string = substr($sign_base_string, 0, -1);
-        $signature        = $this->_sha1($httpmethod . '&' . $this->_url($method) . '&' . $this->_url($sign_base_string));
-
-        $params = array_merge($oauth_params, array(
-            'oauth_signature' => $signature
-        ));
-        ksort($params);
-        $authorization = 'Authorization: OAuth ';
-        foreach ($params as $key => $value) {
-            $authorization .= $key . '="' . $this->_url($value) . '", ';
-        }
-        return substr($authorization, 0, -2);
-    }
-
-    /**
-     * Detects HTTP method to use for API call
-     *
-     * @param string $method The API method to call
-     * @param array  $params The parameters to send along
-     *
-     * @return string The HTTP method that should be used
-     */
-    protected function _detectMethod($method, $params)
-    {
-        // multi-HTTP method endpoints
-        switch($method) {
-            case 'account/settings':
-                $method = count($params) > 0 ? $method . '__post' : $method;
-                break;
-        }
-
-        $httpmethods         = array();
-        $httpmethods['GET']  = array(
-            // Timelines
-            'statuses/mentions_timeline',
-            'statuses/user_timeline',
-            'statuses/home_timeline',
-            'statuses/retweets_of_me',
-
-            // Tweets
-            'statuses/retweets/:id',
-            'statuses/show/:id',
-            'statuses/oembed',
-
-            // Search
-            'search/tweets',
-
-            // Direct Messages
-            'direct_messages',
-            'direct_messages/sent',
-            'direct_messages/show',
-
-            // Friends & Followers
-            'friendships/no_retweets/ids',
-            'friends/ids',
-            'followers/ids',
-            'friendships/lookup',
-            'friendships/incoming',
-            'friendships/outgoing',
-            'friendships/show',
-            'friends/list',
-            'followers/list',
-
-            // Users
-            'account/settings',
-            'account/verify_credentials',
-            'blocks/list',
-            'blocks/ids',
-            'users/lookup',
-            'users/show',
-            'users/search',
-            'users/contributees',
-            'users/contributors',
-            'users/profile_banner',
-
-            // Suggested Users
-            'users/suggestions/:slug',
-            'users/suggestions',
-            'users/suggestions/:slug/members',
-
-            // Favorites
-            'favorites/list',
-
-            // Lists
-            'lists/list',
-            'lists/statuses',
-            'lists/memberships',
-            'lists/subscribers',
-            'lists/subscribers/show',
-            'lists/members/show',
-            'lists/members',
-            'lists/show',
-            'lists/subscriptions',
-
-            // Saved searches
-            'saved_searches/list',
-            'saved_searches/show/:id',
-
-            // Places & Geo
-            'geo/id/:place_id',
-            'geo/reverse_geocode',
-            'geo/search',
-            'geo/similar_places',
-
-            // Trends
-            'trends/place',
-            'trends/available',
-            'trends/closest',
-
-            // OAuth
-            'oauth/authenticate',
-            'oauth/authorize',
-
-            // Help
-            'help/configuration',
-            'help/languages',
-            'help/privacy',
-            'help/tos',
-            'application/rate_limit_status'
-        );
-        $httpmethods['POST'] = array(
-            // Tweets
-            'statuses/destroy/:id',
-            'statuses/update',
-            'statuses/retweet/:id',
-            'statuses/update_with_media',
-
-            // Media resources
-            'statusnet/media/upload',
-
-            // Direct Messages
-            'direct_messages/destroy',
-            'direct_messages/new',
-
-            // Friends & Followers
-            'friendships/create',
-            'friendships/destroy',
-            'friendships/update',
-
-            // Users
-            'account/settings__post',
-            'account/update_delivery_device',
-            'account/update_profile',
-            'account/update_profile_background_image',
-            'account/update_profile_colors',
-            'account/update_profile_image',
-            'blocks/create',
-            'blocks/destroy',
-            'account/update_profile_banner',
-            'account/remove_profile_banner',
-
-            // Favorites
-            'favorites/destroy',
-            'favorites/create',
-
-            // Lists
-            'lists/members/destroy',
-            'lists/subscribers/create',
-            'lists/subscribers/destroy',
-            'lists/members/create_all',
-            'lists/members/create',
-            'lists/destroy',
-            'lists/update',
-            'lists/create',
-            'lists/members/destroy_all',
-
-            // Saved Searches
-            'saved_searches/create',
-            'saved_searches/destroy/:id',
-
-            // Places & Geo
-            'geo/place',
-
-            // Spam Reporting
-            'users/report_spam',
-
-            // OAuth
-            'oauth/access_token',
-            'oauth/request_token',
-            'oauth2/token',
-            'oauth2/invalidate_token'
-        );
-        foreach ($httpmethods as $httpmethod => $methods) {
-            if (in_array($method, $methods)) {
-                return $httpmethod;
-            }
-        }
-        throw new \Exception('Can\'t find HTTP method to use for "' . $method . '".');
-    }
-
-    /**
-     * Detects if API call should use multipart/form-data
-     *
-     * @param string $method The API method to call
-     *
-     * @return bool Whether the method should be sent as multipart
-     */
-    protected function _detectMultipart($method)
-    {
-        $multiparts = array(
-            // Tweets
-            'statuses/update',
-            'statuses/update_with_media',
-
-            // Media ressources
-            'statusnet/media/upload',
-
-            // Users
-            'account/update_profile_background_image',
-            'account/update_profile_image',
-            'account/update_profile_banner'
-        );
-        return in_array($method, $multiparts);
-    }
-
-    /**
-     * Detect filenames in upload parameters,
-     * build multipart request from upload params
-     *
-     * @param string $method  The API method to call
-     * @param array  $params  The parameters to send along
-     *
-     * @return void
-     */
-    protected function _buildMultipart($method, $params)
-    {
-        // well, files will only work in multipart methods
-        if (! $this->_detectMultipart($method)) {
-            return;
-        }
-
-        // only check specific parameters
-        $possible_files = array(
-            // Tweets
-            'statuses/update' => 'media[]',
-            'statuses/update_with_media' => 'media[]',
-            // Accounts
-            'account/update_profile_background_image' => 'image',
-            'account/update_profile_image' => 'image',
-            'account/update_profile_banner' => 'banner'
-        );
-        // method might have files?
-        if (! in_array($method, array_keys($possible_files))) {
-            return;
-        }
-
-        $possible_files = explode(' ', $possible_files[$method]);
-
-        $multipart_border = '--------------------' . $this->_nonce();
-        $multipart_request = '';
-        foreach ($params as $key => $value) {
-            // is it an array?
-            if (is_array($value)) {
-                throw new \Exception('Using URL-encoded parameters is not supported for uploading media.');
-                continue;
-            }
-
-            // check for filenames
-            if (in_array($key, $possible_files)) {
-                if (// is it a file, a readable one?
-                    @file_exists($value)
-                    && @is_readable($value)
-
-                    // is it a valid image?
-                    && $data = @getimagesize($value)
-                ) {
-                    if (// is it a supported image format?
-                        in_array($data[2], $this->_supported_media_files)
-                    ) {
-                        // try to read the file
-                        ob_start();
-                        readfile($value);
-                        $data = ob_get_contents();
-                        ob_end_clean();
-                        if (strlen($data) == 0) {
-                            continue;
-                        }
-                        $value = $data;
-                    }
-                }
-
-               // To-Do
-               $tempfile = tempnam(get_temppath(), "mimecheck");
-               file_put_contents($tempfile, $data);
-               $mime = image_type_to_mime_type(exif_imagetype($tempfile));
-               unlink($tempfile);
-               $filename = "upload";
-               $parametername = str_replace("[]", "", $key);
-
-               $multipart_request .= "--".$multipart_border."\n";
-               $multipart_request .= "Content-Disposition: form-data; name=\"{$parametername}\"; filename=\"{$filename}\"\n";
-               $multipart_request .= "Content-Type: ".$mime."\n";
-               $multipart_request .= "Content-Transfer-Encoding: binary\n\n";
-               $multipart_request .= $data."\n";
-            } else {
-
-               $multipart_request .=
-                       '--' . $multipart_border . "\r\n"
-                       . 'Content-Disposition: form-data; name="' . $key . '"';
-
-               $multipart_request .=
-                       "\r\n\r\n" . $value . "\r\n";
-            }
-        }
-        $multipart_request .= '--' . $multipart_border . '--';
-
-        return $multipart_request;
-    }
-
-
-    /**
-     * Builds the complete API endpoint url
-     *
-     * @param string $method           The API method to call
-     * @param string $method_template  The API method template to call
-     *
-     * @return string The URL to send the request to
-     */
-    protected function _getEndpoint($method, $method_template)
-    {
-        if (substr($method, 0, 5) == 'oauth') {
-            $url = self::$_endpoint_oauth . $method;
-        } else {
-            $url = self::$_endpoint . $method . '.json';
-        }
-        return $url;
-    }
-
-    /**
-     * Calls the API using cURL
-     *
-     * @param string          $httpmethod      The HTTP method to use for making the request
-     * @param string          $method          The API method to call
-     * @param string          $method_template The templated API method to call
-     * @param array  optional $params          The parameters to send along
-     * @param bool   optional $multipart       Whether to use multipart/form-data
-     * @param bool   optional $app_only_auth   Whether to use app-only bearer authentication
-     *
-     * @return mixed The API reply, encoded in the set return_format
-     */
-
-    protected function _callApi($httpmethod, $method, $method_template, $params = array(), $multipart = false, $app_only_auth = false)
-    {
-        if (! function_exists('curl_init')) {
-            throw new \Exception('To make API requests, the PHP curl extension must be available.');
-        }
-        $url = $this->_getEndpoint($method, $method_template);
-        $ch  = false;
-        if ($httpmethod == 'GET') {
-            $url_with_params = $url;
-            if (count($params) > 0) {
-                $url_with_params .= '?' . http_build_query($params);
-            }
-            $authorization = $this->_sign($httpmethod, $url, $params);
-            $ch = curl_init($url_with_params);
-        } else {
-            if ($multipart) {
-                $authorization = $this->_sign($httpmethod, $url, array());
-                $params        = $this->_buildMultipart($method_template, $params);
-            } else {
-                $authorization = $this->_sign($httpmethod, $url, $params);
-                $params        = http_build_query($params);
-            }
-            $ch = curl_init($url);
-            curl_setopt($ch, CURLOPT_POST, 1);
-            curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
-        }
-        if ($app_only_auth) {
-            if (self::$_oauth_consumer_key == null) {
-                throw new \Exception('To make an app-only auth API request, the consumer key must be set.');
-            }
-            // automatically fetch bearer token, if necessary
-            if (self::$_oauth_bearer_token == null) {
-                $this->oauth2_token();
-            }
-            $authorization = 'Authorization: Bearer ' . self::$_oauth_bearer_token;
-        }
-        $request_headers = array();
-        if (isset($authorization)) {
-            $request_headers[] = $authorization;
-            $request_headers[] = 'Expect:';
-        }
-        if ($multipart) {
-            $first_newline      = strpos($params, "\r\n");
-            $multipart_boundary = substr($params, 2, $first_newline - 2);
-            $request_headers[]  = 'Content-Length: ' . strlen($params);
-            $request_headers[]  = 'Content-Type: multipart/form-data; boundary='
-                . $multipart_boundary;
-        }
-
-        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
-        curl_setopt($ch, CURLOPT_HEADER, 1);
-        curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
-        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
-        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
-        //curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem');
-
-        $reply = curl_exec($ch);
-
-        // certificate validation results
-        //$validation_result = curl_errno($ch);
-        //if (in_array(
-        //        $validation_result,
-        //        array(
-        //            CURLE_SSL_CERTPROBLEM,
-        //            CURLE_SSL_CACERT,
-        //            CURLE_SSL_CACERT_BADFILE,
-        //            CURLE_SSL_CRL_BADFILE,
-        //            CURLE_SSL_ISSUER_ERROR
-        //        )
-        //    )
-        //) {
-        //    throw new \Exception('Error ' . $validation_result . ' while validating the Twitter API certificate.');
-        //}
-
-        $httpstatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
-        $reply = $this->_parseApiReply($method_template, $reply);
-        if ($this->_return_format == CODEBIRD_RETURNFORMAT_OBJECT) {
-            $reply->httpstatus = $httpstatus;
-        } elseif ($this->_return_format == CODEBIRD_RETURNFORMAT_ARRAY) {
-            $reply['httpstatus'] = $httpstatus;
-        }
-        return $reply;
-    }
-
-    /**
-     * Parses the API reply to encode it in the set return_format
-     *
-     * @param string $method The method that has been called
-     * @param string $reply  The actual reply, JSON-encoded or URL-encoded
-     *
-     * @return array|object The parsed reply
-     */
-    protected function _parseApiReply($method, $reply)
-    {
-        // split headers and body
-        $headers = array();
-        $reply = explode("\r\n\r\n", $reply, 4);
-
-        // check if using proxy
-        if (substr($reply[0], 0, 35) === 'HTTP/1.1 200 Connection Established') {
-            array_shift($reply);
-        } elseif (count($reply) > 2) {
-            $headers = array_shift($reply);
-            $reply = array(
-                $headers,
-                implode("\r\n", $reply)
-            );
-        }
-
-        $headers_array = explode("\r\n", $reply[0]);
-        foreach ($headers_array as $header) {
-            $header_array = explode(': ', $header, 2);
-            $key = $header_array[0];
-            $value = '';
-            if (count($header_array) > 1) {
-                $value = $header_array[1];
-            }
-            $headers[$key] = $value;
-        }
-        if (count($reply) > 1) {
-            $reply = $reply[1];
-        } else {
-            $reply = '';
-        }
-
-        $need_array = $this->_return_format == CODEBIRD_RETURNFORMAT_ARRAY;
-        if ($reply == '[]') {
-            switch ($this->_return_format) {
-                case CODEBIRD_RETURNFORMAT_ARRAY:
-                    return array();
-                case CODEBIRD_RETURNFORMAT_JSON:
-                    return '{}';
-                case CODEBIRD_RETURNFORMAT_OBJECT:
-                    return new \stdClass;
-            }
-        }
-        $parsed = array();
-        if (! $parsed = json_decode($reply, $need_array)) {
-            if ($reply) {
-                if (stripos($reply, '<' . '?xml version="1.0" encoding="UTF-8"?' . '>') === 0) {
-                    // we received XML...
-                    // since this only happens for errors,
-                    // don't perform a full decoding
-                    preg_match('/<request>(.*)<\/request>/', $reply, $request);
-                    preg_match('/<error>(.*)<\/error>/', $reply, $error);
-                    $parsed['request'] = htmlspecialchars_decode($request[1]);
-                    $parsed['error'] = htmlspecialchars_decode($error[1]);
-                } else {
-                    // assume query format
-                    $reply = explode('&', $reply);
-                    foreach ($reply as $element) {
-                        if (stristr($element, '=')) {
-                            list($key, $value) = explode('=', $element);
-                            $parsed[$key] = $value;
-                        } else {
-                            $parsed['message'] = $element;
-                        }
-                    }
-                }
-            }
-            $reply = json_encode($parsed);
-        }
-        switch ($this->_return_format) {
-            case CODEBIRD_RETURNFORMAT_ARRAY:
-                return $parsed;
-            case CODEBIRD_RETURNFORMAT_JSON:
-                return $reply;
-            case CODEBIRD_RETURNFORMAT_OBJECT:
-                return (object) $parsed;
-        }
-        return $parsed;
-    }
-}
-
-?>
index c8c8cdc352de7a73fd3fa50e7f92b0d89512df94..c2c3404f2c525df453bec337163841416b316eb2 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2015-07-27 07:21+0200\n"
-"PO-Revision-Date: 2015-08-31 10:27+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
diff --git a/statusnet/library/codebirdsn.php b/statusnet/library/codebirdsn.php
new file mode 100644 (file)
index 0000000..cba5f93
--- /dev/null
@@ -0,0 +1,1057 @@
+<?php
+
+namespace CodebirdSN;
+
+/**
+ * A Twitter library in PHP.
+ *
+ * @package codebird
+ * @version 2.4.1
+ * @author J.M. <me@mynetx.net>
+ * @copyright 2010-2013 J.M. <me@mynetx.net>
+ *
+ * Modified for statusnet by Michael Vogel <heluecht@pirati.ca>
+ *
+ * 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/>.
+ */
+
+/**
+ * Define constants
+ */
+$constants = explode(' ', 'OBJECT ARRAY JSON');
+foreach ($constants as $i => $id) {
+    $id = 'CODEBIRD_RETURNFORMAT_' . $id;
+    defined($id) or define($id, $i);
+}
+$constants = array(
+    'CURLE_SSL_CERTPROBLEM' => 58,
+    'CURLE_SSL_CACERT' => 60,
+    'CURLE_SSL_CACERT_BADFILE' => 77,
+    'CURLE_SSL_CRL_BADFILE' => 82,
+    'CURLE_SSL_ISSUER_ERROR' => 83
+);
+foreach ($constants as $id => $i) {
+    defined($id) or define($id, $i);
+}
+unset($constants);
+unset($i);
+unset($id);
+
+/**
+ * A Twitter library in PHP.
+ *
+ * @package codebird
+ * @subpackage codebird-php
+ */
+class CodebirdSN
+{
+    /**
+     * The current singleton instance
+     */
+    private static $_instance = null;
+
+    /**
+     * The OAuth consumer key of your registered app
+     */
+    protected static $_oauth_consumer_key = null;
+
+    /**
+     * The corresponding consumer secret
+     */
+    protected static $_oauth_consumer_secret = null;
+
+    /**
+     * The app-only bearer token. Used to authorize app-only requests
+     */
+    protected static $_oauth_bearer_token = null;
+
+    /**
+     * The API endpoint to use
+     */
+    protected static $_endpoint = 'https://api.twitter.com/1.1/';
+
+    /**
+     * The API endpoint to use for OAuth requests
+     */
+    protected static $_endpoint_oauth = 'https://api.twitter.com/';
+
+    /**
+     * The Request or access token. Used to sign requests
+     */
+    protected $_oauth_token = null;
+
+    /**
+     * The corresponding request or access token secret
+     */
+    protected $_oauth_token_secret = null;
+
+    /**
+     * The format of data to return from API calls
+     */
+    protected $_return_format = CODEBIRD_RETURNFORMAT_OBJECT;
+
+    /**
+     * The file formats that Twitter accepts as image uploads
+     */
+    protected $_supported_media_files = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG);
+
+    /**
+     * The current Codebird version
+     */
+    protected $_version = '2.4.1';
+
+    /**
+     * Returns singleton class instance
+     * Always use this method unless you're working with multiple authenticated users at once
+     *
+     * @return Codebird The instance
+     */
+    public static function getInstance()
+    {
+        if (self::$_instance == null) {
+            self::$_instance = new self;
+        }
+        return self::$_instance;
+    }
+
+    /**
+     * Sets the API endpoint
+     *
+     * @param string $api    API endpoint
+     *
+     * @return void
+     */
+    public static function setAPIEndpoint($api)
+    {
+        self::$_endpoint_oauth = $api;
+        self::$_endpoint       = $api;
+    }
+
+    /**
+     * Sets the OAuth consumer key and secret (App key)
+     *
+     * @param string $key    OAuth consumer key
+     * @param string $secret OAuth consumer secret
+     *
+     * @return void
+     */
+    public static function setConsumerKey($key, $secret)
+    {
+        self::$_oauth_consumer_key    = $key;
+        self::$_oauth_consumer_secret = $secret;
+    }
+
+    /**
+     * Sets the OAuth2 app-only auth bearer token
+     *
+     * @param string $token OAuth2 bearer token
+     *
+     * @return void
+     */
+    public static function setBearerToken($token)
+    {
+        self::$_oauth_bearer_token = $token;
+    }
+
+    /**
+     * Gets the current Codebird version
+     *
+     * @return string The version number
+     */
+    public function getVersion()
+    {
+        return $this->_version;
+    }
+
+    /**
+     * Sets the OAuth request or access token and secret (User key)
+     *
+     * @param string $token  OAuth request or access token
+     * @param string $secret OAuth request or access token secret
+     *
+     * @return void
+     */
+    public function setToken($token, $secret)
+    {
+        $this->_oauth_token        = $token;
+        $this->_oauth_token_secret = $secret;
+    }
+
+    /**
+     * Sets the format for API replies
+     *
+     * @param int $return_format One of these:
+     *                           CODEBIRD_RETURNFORMAT_OBJECT (default)
+     *                           CODEBIRD_RETURNFORMAT_ARRAY
+     *
+     * @return void
+     */
+    public function setReturnFormat($return_format)
+    {
+        $this->_return_format = $return_format;
+    }
+
+    /**
+     * Main API handler working on any requests you issue
+     *
+     * @param string $fn    The member function you called
+     * @param array $params The parameters you sent along
+     *
+     * @return mixed The API reply encoded in the set return_format
+     */
+
+    public function __call($fn, $params)
+    {
+        // parse parameters
+        $apiparams = array();
+        if (count($params) > 0) {
+            if (is_array($params[0])) {
+                $apiparams = $params[0];
+            } else {
+                parse_str($params[0], $apiparams);
+                // remove auto-added slashes if on magic quotes steroids
+                if (get_magic_quotes_gpc()) {
+                    foreach($apiparams as $key => $value) {
+                        if (is_array($value)) {
+                            $apiparams[$key] = array_map('stripslashes', $value);
+                        } else {
+                            $apiparams[$key] = stripslashes($value);
+                        }
+                    }
+                }
+            }
+        }
+
+        // stringify null and boolean parameters
+        foreach ($apiparams as $key => $value) {
+            if (! is_scalar($value)) {
+                continue;
+            }
+            if (is_null($value)) {
+                $apiparams[$key] = 'null';
+            } elseif (is_bool($value)) {
+                $apiparams[$key] = $value ? 'true' : 'false';
+            }
+        }
+
+        $app_only_auth = false;
+        if (count($params) > 1) {
+            $app_only_auth = !! $params[1];
+        }
+
+        // map function name to API method
+        $method = '';
+
+        // replace _ by /
+        $path = explode('_', $fn);
+        for ($i = 0; $i < count($path); $i++) {
+            if ($i > 0) {
+                $method .= '/';
+            }
+            $method .= $path[$i];
+        }
+        // undo replacement for URL parameters
+        $url_parameters_with_underscore = array('screen_name');
+        foreach ($url_parameters_with_underscore as $param) {
+            $param = strtoupper($param);
+            $replacement_was = str_replace('_', '/', $param);
+            $method = str_replace($replacement_was, $param, $method);
+        }
+
+        // replace AA by URL parameters
+        $method_template = $method;
+        $match   = array();
+        if (preg_match('/[A-Z_]{2,}/', $method, $match)) {
+            foreach ($match as $param) {
+                $param_l = strtolower($param);
+                $method_template = str_replace($param, ':' . $param_l, $method_template);
+                if (!isset($apiparams[$param_l])) {
+                    for ($i = 0; $i < 26; $i++) {
+                        $method_template = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method_template);
+                    }
+                    throw new \Exception(
+                        'To call the templated method "' . $method_template
+                        . '", specify the parameter value for "' . $param_l . '".'
+                    );
+                }
+                $method  = str_replace($param, $apiparams[$param_l], $method);
+                unset($apiparams[$param_l]);
+            }
+        }
+
+        // replace A-Z by _a-z
+        for ($i = 0; $i < 26; $i++) {
+            $method  = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method);
+            $method_template = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method_template);
+        }
+
+        $httpmethod = $this->_detectMethod($method_template, $apiparams);
+        $multipart  = $this->_detectMultipart($method_template);
+        return $this->_callApi(
+            $httpmethod,
+            $method,
+            $method_template,
+            $apiparams,
+            $multipart,
+            $app_only_auth
+        );
+    }
+
+    /**
+     * Uncommon API methods
+     */
+
+    /**
+     * Gets the OAuth authenticate URL for the current request token
+     *
+     * @return string The OAuth authenticate URL
+     */
+    public function oauth_authenticate($force_login = NULL, $screen_name = NULL)
+    {
+        if ($this->_oauth_token == null) {
+            throw new \Exception('To get the authenticate URL, the OAuth token must be set.');
+        }
+        $url = self::$_endpoint_oauth . 'oauth/authenticate?oauth_token=' . $this->_url($this->_oauth_token);
+        if ($force_login) {
+            $url .= "&force_login=1";
+        }
+        if ($screen_name) {
+            $url .= "&screen_name=" . $screen_name;
+        }
+        return $url;
+    }
+
+    /**
+     * Gets the OAuth authorize URL for the current request token
+     *
+     * @return string The OAuth authorize URL
+     */
+    public function oauth_authorize($force_login = NULL, $screen_name = NULL)
+    {
+        if ($this->_oauth_token == null) {
+            throw new \Exception('To get the authorize URL, the OAuth token must be set.');
+        }
+        $url = self::$_endpoint_oauth . 'oauth/authorize?oauth_token=' . $this->_url($this->_oauth_token);
+        if ($force_login) {
+            $url .= "&force_login=1";
+        }
+        if ($screen_name) {
+            $url .= "&screen_name=" . $screen_name;
+        }
+        return $url;
+    }
+
+    /**
+     * Gets the OAuth bearer token
+     *
+     * @return string The OAuth bearer token
+     */
+
+    public function oauth2_token()
+    {
+        if (! function_exists('curl_init')) {
+            throw new \Exception('To make API requests, the PHP curl extension must be available.');
+        }
+        if (self::$_oauth_consumer_key == null) {
+            throw new \Exception('To obtain a bearer token, the consumer key must be set.');
+        }
+        $ch  = false;
+        $post_fields = array(
+            'grant_type' => 'client_credentials'
+        );
+        $url = self::$_endpoint_oauth . 'oauth2/token';
+        $ch = curl_init($url);
+        curl_setopt($ch, CURLOPT_POST, 1);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
+        curl_setopt($ch, CURLOPT_HEADER, 1);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
+        //curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem');
+
+        curl_setopt($ch, CURLOPT_USERPWD, self::$_oauth_consumer_key . ':' . self::$_oauth_consumer_secret);
+        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
+            'Expect:'
+        ));
+        $reply = curl_exec($ch);
+
+        // certificate validation results
+        //$validation_result = curl_errno($ch);
+        //if (in_array(
+        //        $validation_result,
+        //        array(
+        //            CURLE_SSL_CERTPROBLEM,
+        //            CURLE_SSL_CACERT,
+        //            CURLE_SSL_CACERT_BADFILE,
+        //            CURLE_SSL_CRL_BADFILE,
+        //            CURLE_SSL_ISSUER_ERROR
+        //        )
+        //    )
+        //) {
+        //    throw new \Exception('Error ' . $validation_result . ' while validating the Twitter API certificate.');
+        //}
+
+        $httpstatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+        $reply = $this->_parseApiReply('oauth2/token', $reply);
+        switch ($this->_return_format) {
+            case CODEBIRD_RETURNFORMAT_ARRAY:
+                $reply['httpstatus'] = $httpstatus;
+                if ($httpstatus == 200) {
+                    self::setBearerToken($reply['access_token']);
+                }
+                break;
+            case CODEBIRD_RETURNFORMAT_JSON:
+                if ($httpstatus == 200) {
+                    $parsed = json_decode($reply);
+                    self::setBearerToken($parsed->access_token);
+                }
+                break;
+            case CODEBIRD_RETURNFORMAT_OBJECT:
+                $reply->httpstatus = $httpstatus;
+                if ($httpstatus == 200) {
+                    self::setBearerToken($reply->access_token);
+                }
+                break;
+        }
+        return $reply;
+    }
+
+    /**
+     * Signing helpers
+     */
+
+    /**
+     * URL-encodes the given data
+     *
+     * @param mixed $data
+     *
+     * @return mixed The encoded data
+     */
+    private function _url($data)
+    {
+        if (is_array($data)) {
+            return array_map(array(
+                $this,
+                '_url'
+            ), $data);
+        } elseif (is_scalar($data)) {
+            return str_replace(array(
+                '+',
+                '!',
+                '*',
+                "'",
+                '(',
+                ')'
+            ), array(
+                ' ',
+                '%21',
+                '%2A',
+                '%27',
+                '%28',
+                '%29'
+            ), rawurlencode($data));
+        } else {
+            return '';
+        }
+    }
+
+    /**
+     * Gets the base64-encoded SHA1 hash for the given data
+     *
+     * @param string $data The data to calculate the hash from
+     *
+     * @return string The hash
+     */
+    private function _sha1($data)
+    {
+        if (self::$_oauth_consumer_secret == null) {
+            throw new \Exception('To generate a hash, the consumer secret must be set.');
+        }
+        if (!function_exists('hash_hmac')) {
+            throw new \Exception('To generate a hash, the PHP hash extension must be available.');
+        }
+        return base64_encode(hash_hmac('sha1', $data, self::$_oauth_consumer_secret . '&'
+            . ($this->_oauth_token_secret != null ? $this->_oauth_token_secret : ''), true));
+    }
+
+    /**
+     * Generates a (hopefully) unique random string
+     *
+     * @param int optional $length The length of the string to generate
+     *
+     * @return string The random string
+     */
+    protected function _nonce($length = 8)
+    {
+        if ($length < 1) {
+            throw new \Exception('Invalid nonce length.');
+        }
+        return substr(md5(microtime(true)), 0, $length);
+    }
+
+    /**
+     * Generates an OAuth signature
+     *
+     * @param string          $httpmethod Usually either 'GET' or 'POST' or 'DELETE'
+     * @param string          $method     The API method to call
+     * @param array  optional $params     The API call parameters, associative
+     *
+     * @return string Authorization HTTP header
+     */
+    protected function _sign($httpmethod, $method, $params = array())
+    {
+        if (self::$_oauth_consumer_key == null) {
+            throw new \Exception('To generate a signature, the consumer key must be set.');
+        }
+        $sign_params      = array(
+            'consumer_key' => self::$_oauth_consumer_key,
+            'version' => '1.0',
+            'timestamp' => time(),
+            'nonce' => $this->_nonce(),
+            'signature_method' => 'HMAC-SHA1'
+        );
+        $sign_base_params = array();
+        foreach ($sign_params as $key => $value) {
+            $sign_base_params['oauth_' . $key] = $this->_url($value);
+        }
+        if ($this->_oauth_token != null) {
+            $sign_base_params['oauth_token'] = $this->_url($this->_oauth_token);
+        }
+        $oauth_params = $sign_base_params;
+        foreach ($params as $key => $value) {
+            $sign_base_params[$key] = $this->_url($value);
+        }
+        ksort($sign_base_params);
+        $sign_base_string = '';
+        foreach ($sign_base_params as $key => $value) {
+            $sign_base_string .= $key . '=' . $value . '&';
+        }
+        $sign_base_string = substr($sign_base_string, 0, -1);
+        $signature        = $this->_sha1($httpmethod . '&' . $this->_url($method) . '&' . $this->_url($sign_base_string));
+
+        $params = array_merge($oauth_params, array(
+            'oauth_signature' => $signature
+        ));
+        ksort($params);
+        $authorization = 'Authorization: OAuth ';
+        foreach ($params as $key => $value) {
+            $authorization .= $key . '="' . $this->_url($value) . '", ';
+        }
+        return substr($authorization, 0, -2);
+    }
+
+    /**
+     * Detects HTTP method to use for API call
+     *
+     * @param string $method The API method to call
+     * @param array  $params The parameters to send along
+     *
+     * @return string The HTTP method that should be used
+     */
+    protected function _detectMethod($method, $params)
+    {
+        // multi-HTTP method endpoints
+        switch($method) {
+            case 'account/settings':
+                $method = count($params) > 0 ? $method . '__post' : $method;
+                break;
+        }
+
+        $httpmethods         = array();
+        $httpmethods['GET']  = array(
+            // Timelines
+            'statuses/mentions_timeline',
+            'statuses/user_timeline',
+            'statuses/home_timeline',
+            'statuses/retweets_of_me',
+
+            // Tweets
+            'statuses/retweets/:id',
+            'statuses/show/:id',
+            'statuses/oembed',
+
+            // Search
+            'search/tweets',
+
+            // Direct Messages
+            'direct_messages',
+            'direct_messages/sent',
+            'direct_messages/show',
+
+            // Friends & Followers
+            'friendships/no_retweets/ids',
+            'friends/ids',
+            'followers/ids',
+            'friendships/lookup',
+            'friendships/incoming',
+            'friendships/outgoing',
+            'friendships/show',
+            'friends/list',
+            'followers/list',
+
+            // Users
+            'account/settings',
+            'account/verify_credentials',
+            'blocks/list',
+            'blocks/ids',
+            'users/lookup',
+            'users/show',
+            'users/search',
+            'users/contributees',
+            'users/contributors',
+            'users/profile_banner',
+
+            // Suggested Users
+            'users/suggestions/:slug',
+            'users/suggestions',
+            'users/suggestions/:slug/members',
+
+            // Favorites
+            'favorites/list',
+
+            // Lists
+            'lists/list',
+            'lists/statuses',
+            'lists/memberships',
+            'lists/subscribers',
+            'lists/subscribers/show',
+            'lists/members/show',
+            'lists/members',
+            'lists/show',
+            'lists/subscriptions',
+
+            // Saved searches
+            'saved_searches/list',
+            'saved_searches/show/:id',
+
+            // Places & Geo
+            'geo/id/:place_id',
+            'geo/reverse_geocode',
+            'geo/search',
+            'geo/similar_places',
+
+            // Trends
+            'trends/place',
+            'trends/available',
+            'trends/closest',
+
+            // OAuth
+            'oauth/authenticate',
+            'oauth/authorize',
+
+            // Help
+            'help/configuration',
+            'help/languages',
+            'help/privacy',
+            'help/tos',
+            'application/rate_limit_status'
+        );
+        $httpmethods['POST'] = array(
+            // Tweets
+            'statuses/destroy/:id',
+            'statuses/update',
+            'statuses/retweet/:id',
+            'statuses/update_with_media',
+
+            // Media resources
+            'statusnet/media/upload',
+
+            // Direct Messages
+            'direct_messages/destroy',
+            'direct_messages/new',
+
+            // Friends & Followers
+            'friendships/create',
+            'friendships/destroy',
+            'friendships/update',
+
+            // Users
+            'account/settings__post',
+            'account/update_delivery_device',
+            'account/update_profile',
+            'account/update_profile_background_image',
+            'account/update_profile_colors',
+            'account/update_profile_image',
+            'blocks/create',
+            'blocks/destroy',
+            'account/update_profile_banner',
+            'account/remove_profile_banner',
+
+            // Favorites
+            'favorites/destroy',
+            'favorites/create',
+
+            // Lists
+            'lists/members/destroy',
+            'lists/subscribers/create',
+            'lists/subscribers/destroy',
+            'lists/members/create_all',
+            'lists/members/create',
+            'lists/destroy',
+            'lists/update',
+            'lists/create',
+            'lists/members/destroy_all',
+
+            // Saved Searches
+            'saved_searches/create',
+            'saved_searches/destroy/:id',
+
+            // Places & Geo
+            'geo/place',
+
+            // Spam Reporting
+            'users/report_spam',
+
+            // OAuth
+            'oauth/access_token',
+            'oauth/request_token',
+            'oauth2/token',
+            'oauth2/invalidate_token'
+        );
+        foreach ($httpmethods as $httpmethod => $methods) {
+            if (in_array($method, $methods)) {
+                return $httpmethod;
+            }
+        }
+        throw new \Exception('Can\'t find HTTP method to use for "' . $method . '".');
+    }
+
+    /**
+     * Detects if API call should use multipart/form-data
+     *
+     * @param string $method The API method to call
+     *
+     * @return bool Whether the method should be sent as multipart
+     */
+    protected function _detectMultipart($method)
+    {
+        $multiparts = array(
+            // Tweets
+            'statuses/update',
+            'statuses/update_with_media',
+
+            // Media ressources
+            'statusnet/media/upload',
+
+            // Users
+            'account/update_profile_background_image',
+            'account/update_profile_image',
+            'account/update_profile_banner'
+        );
+        return in_array($method, $multiparts);
+    }
+
+    /**
+     * Detect filenames in upload parameters,
+     * build multipart request from upload params
+     *
+     * @param string $method  The API method to call
+     * @param array  $params  The parameters to send along
+     *
+     * @return void
+     */
+    protected function _buildMultipart($method, $params)
+    {
+        // well, files will only work in multipart methods
+        if (! $this->_detectMultipart($method)) {
+            return;
+        }
+
+        // only check specific parameters
+        $possible_files = array(
+            // Tweets
+            'statuses/update' => 'media[]',
+            'statuses/update_with_media' => 'media[]',
+            // Accounts
+            'account/update_profile_background_image' => 'image',
+            'account/update_profile_image' => 'image',
+            'account/update_profile_banner' => 'banner'
+        );
+        // method might have files?
+        if (! in_array($method, array_keys($possible_files))) {
+            return;
+        }
+
+        $possible_files = explode(' ', $possible_files[$method]);
+
+        $multipart_border = '--------------------' . $this->_nonce();
+        $multipart_request = '';
+        foreach ($params as $key => $value) {
+            // is it an array?
+            if (is_array($value)) {
+                throw new \Exception('Using URL-encoded parameters is not supported for uploading media.');
+                continue;
+            }
+
+            // check for filenames
+            if (in_array($key, $possible_files)) {
+                if (// is it a file, a readable one?
+                    @file_exists($value)
+                    && @is_readable($value)
+
+                    // is it a valid image?
+                    && $data = @getimagesize($value)
+                ) {
+                    if (// is it a supported image format?
+                        in_array($data[2], $this->_supported_media_files)
+                    ) {
+                        // try to read the file
+                        ob_start();
+                        readfile($value);
+                        $data = ob_get_contents();
+                        ob_end_clean();
+                        if (strlen($data) == 0) {
+                            continue;
+                        }
+                        $value = $data;
+                    }
+                }
+
+               // To-Do
+               $tempfile = tempnam(get_temppath(), "mimecheck");
+               file_put_contents($tempfile, $data);
+               $mime = image_type_to_mime_type(exif_imagetype($tempfile));
+               unlink($tempfile);
+               $filename = "upload";
+               $parametername = str_replace("[]", "", $key);
+
+               $multipart_request .= "--".$multipart_border."\n";
+               $multipart_request .= "Content-Disposition: form-data; name=\"{$parametername}\"; filename=\"{$filename}\"\n";
+               $multipart_request .= "Content-Type: ".$mime."\n";
+               $multipart_request .= "Content-Transfer-Encoding: binary\n\n";
+               $multipart_request .= $data."\n";
+            } else {
+
+               $multipart_request .=
+                       '--' . $multipart_border . "\r\n"
+                       . 'Content-Disposition: form-data; name="' . $key . '"';
+
+               $multipart_request .=
+                       "\r\n\r\n" . $value . "\r\n";
+            }
+        }
+        $multipart_request .= '--' . $multipart_border . '--';
+
+        return $multipart_request;
+    }
+
+
+    /**
+     * Builds the complete API endpoint url
+     *
+     * @param string $method           The API method to call
+     * @param string $method_template  The API method template to call
+     *
+     * @return string The URL to send the request to
+     */
+    protected function _getEndpoint($method, $method_template)
+    {
+        if (substr($method, 0, 5) == 'oauth') {
+            $url = self::$_endpoint_oauth . $method;
+        } else {
+            $url = self::$_endpoint . $method . '.json';
+        }
+        return $url;
+    }
+
+    /**
+     * Calls the API using cURL
+     *
+     * @param string          $httpmethod      The HTTP method to use for making the request
+     * @param string          $method          The API method to call
+     * @param string          $method_template The templated API method to call
+     * @param array  optional $params          The parameters to send along
+     * @param bool   optional $multipart       Whether to use multipart/form-data
+     * @param bool   optional $app_only_auth   Whether to use app-only bearer authentication
+     *
+     * @return mixed The API reply, encoded in the set return_format
+     */
+
+    protected function _callApi($httpmethod, $method, $method_template, $params = array(), $multipart = false, $app_only_auth = false)
+    {
+        if (! function_exists('curl_init')) {
+            throw new \Exception('To make API requests, the PHP curl extension must be available.');
+        }
+        $url = $this->_getEndpoint($method, $method_template);
+        $ch  = false;
+        if ($httpmethod == 'GET') {
+            $url_with_params = $url;
+            if (count($params) > 0) {
+                $url_with_params .= '?' . http_build_query($params);
+            }
+            $authorization = $this->_sign($httpmethod, $url, $params);
+            $ch = curl_init($url_with_params);
+        } else {
+            if ($multipart) {
+                $authorization = $this->_sign($httpmethod, $url, array());
+                $params        = $this->_buildMultipart($method_template, $params);
+            } else {
+                $authorization = $this->_sign($httpmethod, $url, $params);
+                $params        = http_build_query($params);
+            }
+            $ch = curl_init($url);
+            curl_setopt($ch, CURLOPT_POST, 1);
+            curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
+        }
+        if ($app_only_auth) {
+            if (self::$_oauth_consumer_key == null) {
+                throw new \Exception('To make an app-only auth API request, the consumer key must be set.');
+            }
+            // automatically fetch bearer token, if necessary
+            if (self::$_oauth_bearer_token == null) {
+                $this->oauth2_token();
+            }
+            $authorization = 'Authorization: Bearer ' . self::$_oauth_bearer_token;
+        }
+        $request_headers = array();
+        if (isset($authorization)) {
+            $request_headers[] = $authorization;
+            $request_headers[] = 'Expect:';
+        }
+        if ($multipart) {
+            $first_newline      = strpos($params, "\r\n");
+            $multipart_boundary = substr($params, 2, $first_newline - 2);
+            $request_headers[]  = 'Content-Length: ' . strlen($params);
+            $request_headers[]  = 'Content-Type: multipart/form-data; boundary='
+                . $multipart_boundary;
+        }
+
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
+        curl_setopt($ch, CURLOPT_HEADER, 1);
+        curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
+        //curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem');
+
+        $reply = curl_exec($ch);
+
+        // certificate validation results
+        //$validation_result = curl_errno($ch);
+        //if (in_array(
+        //        $validation_result,
+        //        array(
+        //            CURLE_SSL_CERTPROBLEM,
+        //            CURLE_SSL_CACERT,
+        //            CURLE_SSL_CACERT_BADFILE,
+        //            CURLE_SSL_CRL_BADFILE,
+        //            CURLE_SSL_ISSUER_ERROR
+        //        )
+        //    )
+        //) {
+        //    throw new \Exception('Error ' . $validation_result . ' while validating the Twitter API certificate.');
+        //}
+
+        $httpstatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+        $reply = $this->_parseApiReply($method_template, $reply);
+        if ($this->_return_format == CODEBIRD_RETURNFORMAT_OBJECT) {
+            $reply->httpstatus = $httpstatus;
+        } elseif ($this->_return_format == CODEBIRD_RETURNFORMAT_ARRAY) {
+            $reply['httpstatus'] = $httpstatus;
+        }
+        return $reply;
+    }
+
+    /**
+     * Parses the API reply to encode it in the set return_format
+     *
+     * @param string $method The method that has been called
+     * @param string $reply  The actual reply, JSON-encoded or URL-encoded
+     *
+     * @return array|object The parsed reply
+     */
+    protected function _parseApiReply($method, $reply)
+    {
+        // split headers and body
+        $headers = array();
+        $reply = explode("\r\n\r\n", $reply, 4);
+
+        // check if using proxy
+        if (substr($reply[0], 0, 35) === 'HTTP/1.1 200 Connection Established') {
+            array_shift($reply);
+        } elseif (count($reply) > 2) {
+            $headers = array_shift($reply);
+            $reply = array(
+                $headers,
+                implode("\r\n", $reply)
+            );
+        }
+
+        $headers_array = explode("\r\n", $reply[0]);
+        foreach ($headers_array as $header) {
+            $header_array = explode(': ', $header, 2);
+            $key = $header_array[0];
+            $value = '';
+            if (count($header_array) > 1) {
+                $value = $header_array[1];
+            }
+            $headers[$key] = $value;
+        }
+        if (count($reply) > 1) {
+            $reply = $reply[1];
+        } else {
+            $reply = '';
+        }
+
+        $need_array = $this->_return_format == CODEBIRD_RETURNFORMAT_ARRAY;
+        if ($reply == '[]') {
+            switch ($this->_return_format) {
+                case CODEBIRD_RETURNFORMAT_ARRAY:
+                    return array();
+                case CODEBIRD_RETURNFORMAT_JSON:
+                    return '{}';
+                case CODEBIRD_RETURNFORMAT_OBJECT:
+                    return new \stdClass;
+            }
+        }
+        $parsed = array();
+        if (! $parsed = json_decode($reply, $need_array)) {
+            if ($reply) {
+                if (stripos($reply, '<' . '?xml version="1.0" encoding="UTF-8"?' . '>') === 0) {
+                    // we received XML...
+                    // since this only happens for errors,
+                    // don't perform a full decoding
+                    preg_match('/<request>(.*)<\/request>/', $reply, $request);
+                    preg_match('/<error>(.*)<\/error>/', $reply, $error);
+                    $parsed['request'] = htmlspecialchars_decode($request[1]);
+                    $parsed['error'] = htmlspecialchars_decode($error[1]);
+                } else {
+                    // assume query format
+                    $reply = explode('&', $reply);
+                    foreach ($reply as $element) {
+                        if (stristr($element, '=')) {
+                            list($key, $value) = explode('=', $element);
+                            $parsed[$key] = $value;
+                        } else {
+                            $parsed['message'] = $element;
+                        }
+                    }
+                }
+            }
+            $reply = json_encode($parsed);
+        }
+        switch ($this->_return_format) {
+            case CODEBIRD_RETURNFORMAT_ARRAY:
+                return $parsed;
+            case CODEBIRD_RETURNFORMAT_JSON:
+                return $reply;
+            case CODEBIRD_RETURNFORMAT_OBJECT:
+                return (object) $parsed;
+        }
+        return $parsed;
+    }
+}
+
+?>
diff --git a/statusnet/library/statusnetoauth.php b/statusnet/library/statusnetoauth.php
new file mode 100644 (file)
index 0000000..27d9163
--- /dev/null
@@ -0,0 +1,104 @@
+<?php\r
+\r
+use Friendica\Core\Config;\r
+\r
+require_once __DIR__ . DIRECTORY_SEPARATOR . 'twitteroauth.php';\r
+\r
+/*\r
+ * We have to alter the TwitterOAuth class a little bit to work with any GNU Social\r
+ * installation abroad. Basically it's only make the API path variable and be happy.\r
+ *\r
+ * Thank you guys for the Twitter compatible API!\r
+ */\r
+class StatusNetOAuth extends TwitterOAuth\r
+{\r
+       function get_maxlength()\r
+       {\r
+               $config = $this->get($this->host . 'statusnet/config.json');\r
+               return $config->site->textlimit;\r
+       }\r
+\r
+       function accessTokenURL()\r
+       {\r
+               return $this->host . 'oauth/access_token';\r
+       }\r
+\r
+       function authenticateURL()\r
+       {\r
+               return $this->host . 'oauth/authenticate';\r
+       }\r
+\r
+       function authorizeURL()\r
+       {\r
+               return $this->host . 'oauth/authorize';\r
+       }\r
+\r
+       function requestTokenURL()\r
+       {\r
+               return $this->host . 'oauth/request_token';\r
+       }\r
+\r
+       function __construct($apipath, $consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL)\r
+       {\r
+               parent::__construct($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);\r
+               $this->host = $apipath;\r
+       }\r
+\r
+       /**\r
+        * Make an HTTP request\r
+        *\r
+        * Copied here from the TwitterOAuth library and complemented by applying the proxy settings of Friendica\r
+        *\r
+        * @param string $method\r
+        * @param string $host\r
+        * @param string $path\r
+        * @param array  $parameters\r
+        *\r
+        * @return array|object API results\r
+        */\r
+       function http($url, $method, $postfields = NULL)\r
+       {\r
+               $this->http_info = [];\r
+               $ci = curl_init();\r
+               /* Curl settings */\r
+               $prx = Config::get('system', 'proxy');\r
+               if (strlen($prx)) {\r
+                       curl_setopt($ci, CURLOPT_HTTPPROXYTUNNEL, 1);\r
+                       curl_setopt($ci, CURLOPT_PROXY, $prx);\r
+                       $prxusr = Config::get('system', 'proxyuser');\r
+                       if (strlen($prxusr)) {\r
+                               curl_setopt($ci, CURLOPT_PROXYUSERPWD, $prxusr);\r
+                       }\r
+               }\r
+               curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);\r
+               curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);\r
+               curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);\r
+               curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);\r
+               curl_setopt($ci, CURLOPT_HTTPHEADER, ['Expect:']);\r
+               curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);\r
+               curl_setopt($ci, CURLOPT_HEADERFUNCTION, [$this, 'getHeader']);\r
+               curl_setopt($ci, CURLOPT_HEADER, FALSE);\r
+\r
+               switch ($method) {\r
+                       case 'POST':\r
+                               curl_setopt($ci, CURLOPT_POST, TRUE);\r
+                               if (!empty($postfields)) {\r
+                                       curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);\r
+                               }\r
+                               break;\r
+                       case 'DELETE':\r
+                               curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');\r
+                               if (!empty($postfields)) {\r
+                                       $url = "{$url}?{$postfields}";\r
+                               }\r
+               }\r
+\r
+               curl_setopt($ci, CURLOPT_URL, $url);\r
+               $response = curl_exec($ci);\r
+               $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);\r
+               $this->http_info = array_merge($this->http_info, curl_getinfo($ci));\r
+               $this->url = $url;\r
+               curl_close($ci);\r
+               return $response;\r
+       }\r
+}\r
diff --git a/statusnet/library/twitteroauth.php b/statusnet/library/twitteroauth.php
new file mode 100644 (file)
index 0000000..bf56fc0
--- /dev/null
@@ -0,0 +1,277 @@
+<?php
+
+/*
+ * Abraham Williams (abraham@abrah.am) http://abrah.am
+ *
+ * The first PHP Library to support OAuth for Twitter's REST API.
+ *
+ * Version 0.2.0 kept for compatibility purpose with StatusNetOAuth
+ */
+
+/**
+ * Twitter OAuth class
+ */
+class TwitterOAuth
+{
+       /* Contains the last HTTP status code returned. */
+       public $http_code;
+       /* Contains the last API call. */
+       public $url;
+       /* Set up the API root URL. */
+       public $host = "https://api.twitter.com/1.1/";
+       /* Set timeout default. */
+       public $timeout = 30;
+       /* Set connect timeout. */
+       public $connecttimeout = 30;
+       /* Verify SSL Cert. */
+       public $ssl_verifypeer = FALSE;
+       /* Respons format. */
+       public $format = 'json';
+       /* Decode returned json data. */
+       public $decode_json = TRUE;
+       /* Contains the last HTTP headers returned. */
+       public $http_info;
+       /* Set the useragnet. */
+       public $useragent = 'TwitterOAuth v0.2.0-beta2';
+
+       /* Immediately retry the API call if the response was not successful. */
+       //public $retry = TRUE;
+
+       /**
+        * Set API URLS
+        */
+       function accessTokenURL()
+       {
+               return 'https://api.twitter.com/oauth/access_token';
+       }
+
+       function authenticateURL()
+       {
+               return 'https://twitter.com/oauth/authenticate';
+       }
+
+       function authorizeURL()
+       {
+               return 'https://twitter.com/oauth/authorize';
+       }
+
+       function requestTokenURL()
+       {
+               return 'https://api.twitter.com/oauth/request_token';
+       }
+
+       /**
+        * Debug helpers
+        */
+       function lastStatusCode()
+       {
+               return $this->http_status;
+       }
+
+       function lastAPICall()
+       {
+               return $this->last_api_call;
+       }
+
+       /**
+        * construct TwitterOAuth object
+        */
+       function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL)
+       {
+               $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1();
+               $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret);
+               if (!empty($oauth_token) && !empty($oauth_token_secret)) {
+                       $this->token = new OAuthConsumer($oauth_token, $oauth_token_secret);
+               } else {
+                       $this->token = NULL;
+               }
+       }
+
+       /**
+        * Get a request_token from Twitter
+        *
+        * @returns a key/value array containing oauth_token and oauth_token_secret
+        */
+       function getRequestToken($oauth_callback = NULL)
+       {
+               $parameters = array();
+               if (!empty($oauth_callback)) {
+                       $parameters['oauth_callback'] = $oauth_callback;
+               }
+               $request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters);
+               $token = OAuthUtil::parse_parameters($request);
+               $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
+               return $token;
+       }
+
+       /**
+        * Get the authorize URL
+        *
+        * @returns a string
+        */
+       function getAuthorizeURL($token, $sign_in_with_twitter = TRUE)
+       {
+               if (is_array($token)) {
+                       $token = $token['oauth_token'];
+               }
+               if (empty($sign_in_with_twitter)) {
+                       return $this->authorizeURL() . "?oauth_token={$token}";
+               } else {
+                       return $this->authenticateURL() . "?oauth_token={$token}";
+               }
+       }
+
+       /**
+        * Exchange request token and secret for an access token and
+        * secret, to sign API calls.
+        *
+        * @returns array("oauth_token" => "the-access-token",
+        *                "oauth_token_secret" => "the-access-secret",
+        *                "user_id" => "9436992",
+        *                "screen_name" => "abraham")
+        */
+       function getAccessToken($oauth_verifier = FALSE)
+       {
+               $parameters = array();
+               if (!empty($oauth_verifier)) {
+                       $parameters['oauth_verifier'] = $oauth_verifier;
+               }
+               $request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters);
+               $token = OAuthUtil::parse_parameters($request);
+               $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
+               return $token;
+       }
+
+       /**
+        * One time exchange of username and password for access token and secret.
+        *
+        * @returns array("oauth_token" => "the-access-token",
+        *                "oauth_token_secret" => "the-access-secret",
+        *                "user_id" => "9436992",
+        *                "screen_name" => "abraham",
+        *                "x_auth_expires" => "0")
+        */
+       function getXAuthToken($username, $password)
+       {
+               $parameters = array();
+               $parameters['x_auth_username'] = $username;
+               $parameters['x_auth_password'] = $password;
+               $parameters['x_auth_mode'] = 'client_auth';
+               $request = $this->oAuthRequest($this->accessTokenURL(), 'POST', $parameters);
+               $token = OAuthUtil::parse_parameters($request);
+               $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
+               return $token;
+       }
+
+       /**
+        * GET wrapper for oAuthRequest.
+        */
+       function get($url, $parameters = array())
+       {
+               $response = $this->oAuthRequest($url, 'GET', $parameters);
+               if ($this->format === 'json' && $this->decode_json) {
+                       return json_decode($response);
+               }
+               return $response;
+       }
+
+       /**
+        * POST wrapper for oAuthRequest.
+        */
+       function post($url, $parameters = array())
+       {
+               $response = $this->oAuthRequest($url, 'POST', $parameters);
+               if ($this->format === 'json' && $this->decode_json) {
+                       return json_decode($response);
+               }
+               return $response;
+       }
+
+       /**
+        * DELETE wrapper for oAuthReqeust.
+        */
+       function delete($url, $parameters = array())
+       {
+               $response = $this->oAuthRequest($url, 'DELETE', $parameters);
+               if ($this->format === 'json' && $this->decode_json) {
+                       return json_decode($response);
+               }
+               return $response;
+       }
+
+       /**
+        * Format and sign an OAuth / API request
+        */
+       function oAuthRequest($url, $method, $parameters)
+       {
+               if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0) {
+                       $url = "{$this->host}{$url}.{$this->format}";
+               }
+               $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);
+               $request->sign_request($this->sha1_method, $this->consumer, $this->token);
+               switch ($method) {
+                       case 'GET':
+                               return $this->http($request->to_url(), 'GET');
+                       case 'UPLOAD':
+                               return $this->http($request->get_normalized_http_url(), 'POST', $request->to_postdata(true));
+                       default:
+                               return $this->http($request->get_normalized_http_url(), $method, $request->to_postdata());
+               }
+       }
+
+       /**
+        * Make an HTTP request
+        *
+        * @return API results
+        */
+       function http($url, $method, $postfields = NULL)
+       {
+               $this->http_info = array();
+               $ci = curl_init();
+               /* Curl settings */
+               curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
+               curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
+               curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
+               curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
+               curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
+               curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
+               curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
+               curl_setopt($ci, CURLOPT_HEADER, FALSE);
+
+               switch ($method) {
+                       case 'POST':
+                               curl_setopt($ci, CURLOPT_POST, TRUE);
+                               if (!empty($postfields)) {
+                                       curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
+                               }
+                               break;
+                       case 'DELETE':
+                               curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
+                               if (!empty($postfields)) {
+                                       $url = "{$url}?{$postfields}";
+                               }
+               }
+
+               curl_setopt($ci, CURLOPT_URL, $url);
+               $response = curl_exec($ci);
+               $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
+               $this->http_info = array_merge($this->http_info, curl_getinfo($ci));
+               $this->url = $url;
+               curl_close($ci);
+               return $response;
+       }
+
+       /**
+        * Get the header info to store.
+        */
+       function getHeader($ch, $header)
+       {
+               $i = strpos($header, ':');
+               if (!empty($i)) {
+                       $key = str_replace('-', '_', strtolower(substr($header, 0, $i)));
+                       $value = trim(substr($header, $i + 2));
+                       $this->http_header[$key] = $value;
+               }
+               return strlen($header);
+       }
+}
index a004a6243cbc4c8c1aa7246b873d00b49f99f904..16f68a8aa1f5b36f5cf190ebdcddb4b8278b9896 100644 (file)
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  */
-
-
-/***
- * We have to alter the TwitterOAuth class a little bit to work with any GNU Social
- * installation abroad. Basically it's only make the API path variable and be happy.
- *
- * Thank you guys for the Twitter compatible API!
- */
-
 define('STATUSNET_DEFAULT_POLL_INTERVAL', 5); // given in minutes
 
-require_once('library/twitteroauth.php');
-require_once('include/enotify.php');
-require_once("include/socgraph.php");
-
-class StatusNetOAuth extends TwitterOAuth {
-    function get_maxlength() {
-       $config = $this->get($this->host . 'statusnet/config.json');
-       return $config->site->textlimit;
-    }
-    function accessTokenURL()  { return $this->host.'oauth/access_token'; }
-    function authenticateURL() { return $this->host.'oauth/authenticate'; }
-    function authorizeURL() { return $this->host.'oauth/authorize'; }
-    function requestTokenURL() { return $this->host.'oauth/request_token'; }
-    function __construct($apipath, $consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) {
-       parent::__construct($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);
-       $this->host = $apipath;
-    }
-  /**
-   * Make an HTTP request
-   *
-   * @return API results
-   *
-   * Copied here from the twitteroauth library and complemented by applying the proxy settings of friendica
-   */
-  function http($url, $method, $postfields = NULL) {
-    $this->http_info = array();
-    $ci = curl_init();
-    /* Curl settings */
-    $prx = get_config('system','proxy');
-    if(strlen($prx)) {
-       curl_setopt($ci, CURLOPT_HTTPPROXYTUNNEL, 1);
-       curl_setopt($ci, CURLOPT_PROXY, $prx);
-       $prxusr = get_config('system','proxyuser');
-       if(strlen($prxusr))
-           curl_setopt($ci, CURLOPT_PROXYUSERPWD, $prxusr);
-    }
-    curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
-    curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
-    curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
-    curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
-    curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
-    curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
-    curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
-    curl_setopt($ci, CURLOPT_HEADER, FALSE);
-
-    switch ($method) {
-      case 'POST':
-       curl_setopt($ci, CURLOPT_POST, TRUE);
-       if (!empty($postfields)) {
-         curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
-       }
-       break;
-      case 'DELETE':
-       curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
-       if (!empty($postfields)) {
-         $url = "{$url}?{$postfields}";
-       }
-    }
-
-    curl_setopt($ci, CURLOPT_URL, $url);
-    $response = curl_exec($ci);
-    $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
-    $this->http_info = array_merge($this->http_info, curl_getinfo($ci));
-    $this->url = $url;
-    curl_close ($ci);
-    return $response;
-  }
-}
+require_once __DIR__ . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'statusnetoauth.php';
+require_once 'include/enotify.php';
+
+use Codebird\Codebird;
+use CodebirdSN\CodebirdSN;
+use Friendica\App;
+use Friendica\Content\OEmbed;
+use Friendica\Content\Text\BBCode;
+use Friendica\Content\Text\Plaintext;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Model\GContact;
+use Friendica\Model\Group;
+use Friendica\Model\Item;
+use Friendica\Model\Photo;
+use Friendica\Model\User;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
 
 function statusnet_install() {
        //  we need some hooks, for the configuration and for sending tweets
-       register_hook('connector_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
-       register_hook('connector_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
-       register_hook('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
-       register_hook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local');
-       register_hook('jot_networks',    'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
-       register_hook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron');
-       register_hook('prepare_body', 'addon/statusnet/statusnet.php', 'statusnet_prepare_body');
-       register_hook('check_item_notification','addon/statusnet/statusnet.php', 'statusnet_check_item_notification');
+       Addon::registerHook('connector_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
+       Addon::registerHook('connector_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
+       Addon::registerHook('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
+       Addon::registerHook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local');
+       Addon::registerHook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
+       Addon::registerHook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron');
+       Addon::registerHook('prepare_body', 'addon/statusnet/statusnet.php', 'statusnet_prepare_body');
+       Addon::registerHook('check_item_notification', 'addon/statusnet/statusnet.php', 'statusnet_check_item_notification');
        logger("installed GNU Social");
 }
 
-
-function statusnet_uninstall() {
-       unregister_hook('connector_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
-       unregister_hook('connector_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
-       unregister_hook('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
-       unregister_hook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local');
-       unregister_hook('jot_networks',    'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
-       unregister_hook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron');
-       unregister_hook('prepare_body', 'addon/statusnet/statusnet.php', 'statusnet_prepare_body');
-       unregister_hook('check_item_notification','addon/statusnet/statusnet.php', 'statusnet_check_item_notification');
+function statusnet_uninstall()
+{
+       Addon::unregisterHook('connector_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
+       Addon::unregisterHook('connector_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
+       Addon::unregisterHook('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
+       Addon::unregisterHook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local');
+       Addon::unregisterHook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
+       Addon::unregisterHook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron');
+       Addon::unregisterHook('prepare_body', 'addon/statusnet/statusnet.php', 'statusnet_prepare_body');
+       Addon::unregisterHook('check_item_notification', 'addon/statusnet/statusnet.php', 'statusnet_check_item_notification');
 
        // old setting - remove only
-       unregister_hook('post_local_end', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
-       unregister_hook('plugin_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
-       unregister_hook('plugin_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
-
+       Addon::unregisterHook('post_local_end', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
+       Addon::unregisterHook('addon_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
 }
 
 function statusnet_check_item_notification($a, &$notification_data) {
@@ -156,7 +98,7 @@ function statusnet_jot_nets(&$a,&$b) {
                $statusnet_defpost = get_pconfig(local_user(),'statusnet','post_by_default');
                $selected = ((intval($statusnet_defpost) == 1) ? ' checked="checked" ' : '');
                $b .= '<div class="profile-jot-net"><input type="checkbox" name="statusnet_enable"' . $selected . ' value="1" /> '
-                       . t('Post to GNU Social') . '</div>';
+                       . L10n::t('Post to GNU Social') . '</div>';
        }
 }
 
@@ -184,24 +126,53 @@ function statusnet_settings_post ($a,$post) {
                del_pconfig(local_user(), 'statusnet', 'create_user');
                del_pconfig(local_user(), 'statusnet', 'own_id');
        } else {
-       if (isset($_POST['statusnet-preconf-apiurl'])) {
-               /***
-                * If the user used one of the preconfigured GNU Social server credentials
-                * use them. All the data are available in the global config.
-                * Check the API Url never the less and blame the admin if it's not working ^^
-                */
-               $globalsn = get_config('statusnet', 'sites');
-               foreach ( $globalsn as $asn) {
-                       if ($asn['apiurl'] == $_POST['statusnet-preconf-apiurl'] ) {
-                               $apibase = $asn['apiurl'];
-                               $c = fetch_url( $apibase . 'statusnet/version.xml' );
+               if (isset($_POST['statusnet-preconf-apiurl'])) {
+                       /*                       * *
+                        * If the user used one of the preconfigured GNU Social server credentials
+                        * use them. All the data are available in the global config.
+                        * Check the API Url never the less and blame the admin if it's not working ^^
+                        */
+                       $globalsn = Config::get('statusnet', 'sites');
+                       foreach ($globalsn as $asn) {
+                               if ($asn['apiurl'] == $_POST['statusnet-preconf-apiurl']) {
+                                       $apibase = $asn['apiurl'];
+                                       $c = Network::fetchUrl($apibase . 'statusnet/version.xml');
+                                       if (strlen($c) > 0) {
+                                               PConfig::set(local_user(), 'statusnet', 'consumerkey', $asn['consumerkey']);
+                                               PConfig::set(local_user(), 'statusnet', 'consumersecret', $asn['consumersecret']);
+                                               PConfig::set(local_user(), 'statusnet', 'baseapi', $asn['apiurl']);
+                                               //PConfig::set(local_user(), 'statusnet', 'application_name', $asn['applicationname'] );
+                                       } else {
+                                               notice(L10n::t('Please contact your site administrator.<br />The provided API URL is not valid.') . EOL . $asn['apiurl'] . EOL);
+                                       }
+                               }
+                       }
+                       goaway('settings/connectors');
+               } else {
+                       if (isset($_POST['statusnet-consumersecret'])) {
+                               //  check if we can reach the API of the GNU Social server
+                               //  we'll check the API Version for that, if we don't get one we'll try to fix the path but will
+                               //  resign quickly after this one try to fix the path ;-)
+                               $apibase = $_POST['statusnet-baseapi'];
+                               $c = Network::fetchUrl($apibase . 'statusnet/version.xml');
                                if (strlen($c) > 0) {
                                        set_pconfig(local_user(), 'statusnet', 'consumerkey', $asn['consumerkey'] );
                                        set_pconfig(local_user(), 'statusnet', 'consumersecret', $asn['consumersecret'] );
                                        set_pconfig(local_user(), 'statusnet', 'baseapi', $asn['apiurl'] );
                                        //set_pconfig(local_user(), 'statusnet', 'application_name', $asn['applicationname'] );
                                } else {
-                                       notice( t('Please contact your site administrator.<br />The provided API URL is not valid.').EOL.$asn['apiurl'].EOL );
+                                       //  the API path is not correct, maybe missing trailing / ?
+                                       $apibase = $apibase . '/';
+                                       $c = Network::fetchUrl($apibase . 'statusnet/version.xml');
+                                       if (strlen($c) > 0) {
+                                               //  ok the API path is now correct, let's save the settings
+                                               PConfig::set(local_user(), 'statusnet', 'consumerkey', $_POST['statusnet-consumerkey']);
+                                               PConfig::set(local_user(), 'statusnet', 'consumersecret', $_POST['statusnet-consumersecret']);
+                                               PConfig::set(local_user(), 'statusnet', 'baseapi', $apibase);
+                                       } else {
+                                               //  still not the correct API base, let's do noting
+                                               notice(L10n::t('We could not contact the GNU Social API with the Path you entered.') . EOL);
+                                       }
                                }
                        }
                }
@@ -229,8 +200,37 @@ function statusnet_settings_post ($a,$post) {
                                set_pconfig(local_user(), 'statusnet', 'consumersecret', $_POST['statusnet-consumersecret']);
                                set_pconfig(local_user(), 'statusnet', 'baseapi', $apibase );
                        } else {
-                               //  still not the correct API base, let's do noting
-                               notice( t('We could not contact the GNU Social API with the Path you entered.').EOL );
+                               if (isset($_POST['statusnet-pin'])) {
+                                       //  if the user supplied us with a PIN from GNU Social, let the magic of OAuth happen
+                                       $api = PConfig::get(local_user(), 'statusnet', 'baseapi');
+                                       $ckey = PConfig::get(local_user(), 'statusnet', 'consumerkey');
+                                       $csecret = PConfig::get(local_user(), 'statusnet', 'consumersecret');
+                                       //  the token and secret for which the PIN was generated were hidden in the settings
+                                       //  form as token and token2, we need a new connection to GNU Social using these token
+                                       //  and secret to request a Access Token with the PIN
+                                       $connection = new StatusNetOAuth($api, $ckey, $csecret, $_POST['statusnet-token'], $_POST['statusnet-token2']);
+                                       $token = $connection->getAccessToken($_POST['statusnet-pin']);
+                                       //  ok, now that we have the Access Token, save them in the user config
+                                       PConfig::set(local_user(), 'statusnet', 'oauthtoken', $token['oauth_token']);
+                                       PConfig::set(local_user(), 'statusnet', 'oauthsecret', $token['oauth_token_secret']);
+                                       PConfig::set(local_user(), 'statusnet', 'post', 1);
+                                       PConfig::set(local_user(), 'statusnet', 'post_taglinks', 1);
+                                       //  reload the Addon Settings page, if we don't do it see Bug #42
+                                       goaway('settings/connectors');
+                               } else {
+                                       //  if no PIN is supplied in the POST variables, the user has changed the setting
+                                       //  to post a dent for every new __public__ posting to the wall
+                                       PConfig::set(local_user(), 'statusnet', 'post', intval($_POST['statusnet-enable']));
+                                       PConfig::set(local_user(), 'statusnet', 'post_by_default', intval($_POST['statusnet-default']));
+                                       PConfig::set(local_user(), 'statusnet', 'mirror_posts', intval($_POST['statusnet-mirror']));
+                                       PConfig::set(local_user(), 'statusnet', 'import', intval($_POST['statusnet-import']));
+                                       PConfig::set(local_user(), 'statusnet', 'create_user', intval($_POST['statusnet-create_user']));
+
+                                       if (!intval($_POST['statusnet-mirror']))
+                                               PConfig::delete(local_user(), 'statusnet', 'lastid');
+
+                                       info(L10n::t('GNU Social settings updated.') . EOL);
+                               }
                        }
                }
                goaway($a->get_baseurl().'/settings/connectors');
@@ -299,11 +299,11 @@ function statusnet_settings(&$a,&$s) {
        $css = (($enabled) ? '' : '-disabled');
 
        $s .= '<span id="settings_statusnet_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_statusnet_expanded\'); openClose(\'settings_statusnet_inflated\');">';
-       $s .= '<img class="connector'.$css.'" src="images/gnusocial.png" /><h3 class="connector">'. t('GNU Social Import/Export/Mirror').'</h3>';
+       $s .= '<img class="connector' . $css . '" src="images/gnusocial.png" /><h3 class="connector">' . L10n::t('GNU Social Import/Export/Mirror') . '</h3>';
        $s .= '</span>';
        $s .= '<div id="settings_statusnet_expanded" class="settings-block" style="display: none;">';
        $s .= '<span class="fakelink" onclick="openClose(\'settings_statusnet_expanded\'); openClose(\'settings_statusnet_inflated\');">';
-       $s .= '<img class="connector'.$css.'" src="images/gnusocial.png" /><h3 class="connector">'. t('GNU Social Import/Export/Mirror').'</h3>';
+       $s .= '<img class="connector' . $css . '" src="images/gnusocial.png" /><h3 class="connector">' . L10n::t('GNU Social Import/Export/Mirror') . '</h3>';
        $s .= '</span>';
 
        if ( (!$ckey) && (!$csecret) ) {
@@ -317,32 +317,32 @@ function statusnet_settings(&$a,&$s) {
                 * with a little explanation to the user as choice - otherwise
                 * ignore this option entirely.
                 */
-               if (! $globalsn == null) {
-                       $s .= '<h4>' . t('Globally Available GNU Social OAuthKeys') . '</h4>';
-                       $s .= '<p>'. t("There are preconfigured OAuth key pairs for some GNU Social servers available. If you are using one of them, please use these credentials. If not feel free to connect to any other GNU Social instance \x28see below\x29.") .'</p>';
+               if (!$globalsn == null) {
+                       $s .= '<h4>' . L10n::t('Globally Available GNU Social OAuthKeys') . '</h4>';
+                       $s .= '<p>' . L10n::t("There are preconfigured OAuth key pairs for some GNU Social servers available. If you are using one of them, please use these credentials. If not feel free to connect to any other GNU Social instance \x28see below\x29.") . '</p>';
                        $s .= '<div id="statusnet-preconf-wrapper">';
                        foreach ($globalsn as $asn) {
                                $s .= '<input type="radio" name="statusnet-preconf-apiurl" value="'. $asn['apiurl'] .'">'. $asn['sitename'] .'<br />';
                        }
                        $s .= '<p></p><div class="clear"></div></div>';
-                       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+                       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
                }
-               $s .= '<h4>' . t('Provide your own OAuth Credentials') . '</h4>';
-               $s .= '<p>'. t('No consumer key pair for GNU Social found. Register your Friendica Account as an desktop client on your GNU Social account, copy the consumer key pair here and enter the API base root.<br />Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited GNU Social installation.') .'</p>';
+               $s .= '<h4>' . L10n::t('Provide your own OAuth Credentials') . '</h4>';
+               $s .= '<p>' . L10n::t('No consumer key pair for GNU Social found. Register your Friendica Account as an desktop client on your GNU Social account, copy the consumer key pair here and enter the API base root.<br />Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited GNU Social installation.') . '</p>';
                $s .= '<div id="statusnet-consumer-wrapper">';
-               $s .= '<label id="statusnet-consumerkey-label" for="statusnet-consumerkey">'. t('OAuth Consumer Key') .'</label>';
+               $s .= '<label id="statusnet-consumerkey-label" for="statusnet-consumerkey">' . L10n::t('OAuth Consumer Key') . '</label>';
                $s .= '<input id="statusnet-consumerkey" type="text" name="statusnet-consumerkey" size="35" /><br />';
                $s .= '<div class="clear"></div>';
-               $s .= '<label id="statusnet-consumersecret-label" for="statusnet-consumersecret">'. t('OAuth Consumer Secret') .'</label>';
+               $s .= '<label id="statusnet-consumersecret-label" for="statusnet-consumersecret">' . L10n::t('OAuth Consumer Secret') . '</label>';
                $s .= '<input id="statusnet-consumersecret" type="text" name="statusnet-consumersecret" size="35" /><br />';
                $s .= '<div class="clear"></div>';
-               $s .= '<label id="statusnet-baseapi-label" for="statusnet-baseapi">'. t("Base API Path \x28remember the trailing /\x29") .'</label>';
+               $s .= '<label id="statusnet-baseapi-label" for="statusnet-baseapi">' . L10n::t("Base API Path \x28remember the trailing /\x29") . '</label>';
                $s .= '<input id="statusnet-baseapi" type="text" name="statusnet-baseapi" size="35" /><br />';
                $s .= '<div class="clear"></div>';
-               //$s .= '<label id="statusnet-applicationname-label" for="statusnet-applicationname">'.t('GNU Socialapplication name').'</label>';
+               //$s .= '<label id="statusnet-applicationname-label" for="statusnet-applicationname">'.L10n::t('GNU Socialapplication name').'</label>';
                //$s .= '<input id="statusnet-applicationname" type="text" name="statusnet-applicationname" size="35" /><br />';
                $s .= '<p></p><div class="clear"></div>';
-               $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+               $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
                $s .= '</div>';
        } else {
                /***
@@ -361,22 +361,22 @@ function statusnet_settings(&$a,&$s) {
                        /***
                         *  make some nice form
                         */
-                       $s .= '<p>'. t('To connect to your GNU Social account click the button below to get a security code from GNU Social which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to GNU Social.') .'</p>';
-                       $s .= '<a href="'.$connection->getAuthorizeURL($token,False).'" target="_statusnet"><img src="addon/statusnet/signinwithstatusnet.png" alt="'. t('Log in with GNU Social') .'"></a>';
+                       $s .= '<p>' . L10n::t('To connect to your GNU Social account click the button below to get a security code from GNU Social which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to GNU Social.') . '</p>';
+                       $s .= '<a href="' . $connection->getAuthorizeURL($token, False) . '" target="_statusnet"><img src="addon/statusnet/signinwithstatusnet.png" alt="' . L10n::t('Log in with GNU Social') . '"></a>';
                        $s .= '<div id="statusnet-pin-wrapper">';
-                       $s .= '<label id="statusnet-pin-label" for="statusnet-pin">'. t('Copy the security code from GNU Social here') .'</label>';
+                       $s .= '<label id="statusnet-pin-label" for="statusnet-pin">' . L10n::t('Copy the security code from GNU Social here') . '</label>';
                        $s .= '<input id="statusnet-pin" type="text" name="statusnet-pin" />';
                        $s .= '<input id="statusnet-token" type="hidden" name="statusnet-token" value="'.$token.'" />';
                        $s .= '<input id="statusnet-token2" type="hidden" name="statusnet-token2" value="'.$request_token['oauth_token_secret'].'" />';
                        $s .= '</div><div class="clear"></div>';
-                       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
-                       $s .= '<h4>'.t('Cancel Connection Process').'</h4>';
+                       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
+                       $s .= '<h4>' . L10n::t('Cancel Connection Process') . '</h4>';
                        $s .= '<div id="statusnet-cancel-wrapper">';
-                       $s .= '<p>'.t('Current GNU Social API is').': '.$api.'</p>';
-                       $s .= '<label id="statusnet-cancel-label" for="statusnet-cancel">'t('Cancel GNU Social Connection') . '</label>';
+                       $s .= '<p>' . L10n::t('Current GNU Social API is') . ': ' . $api . '</p>';
+                       $s .= '<label id="statusnet-cancel-label" for="statusnet-cancel">' . L10n::t('Cancel GNU Social Connection') . '</label>';
                        $s .= '<input id="statusnet-cancel" type="checkbox" name="statusnet-disconnect" value="1" />';
                        $s .= '</div><div class="clear"></div>';
-                       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+                       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
                } else {
                        /***
                         *  we have an OAuth key / secret pair for the user
@@ -384,44 +384,44 @@ function statusnet_settings(&$a,&$s) {
                         */
                        $connection = new StatusNetOAuth($api,$ckey,$csecret,$otoken,$osecret);
                        $details = $connection->get('account/verify_credentials');
-                       $s .= '<div id="statusnet-info" ><img id="statusnet-avatar" src="'.$details->profile_image_url.'" /><p id="statusnet-info-block">'. t('Currently connected to: ') .'<a href="'.$details->statusnet_profile_url.'" target="_statusnet">'.$details->screen_name.'</a><br /><em>'.$details->description.'</em></p></div>';
-                       $s .= '<p>'. t('If enabled all your <strong>public</strong> postings can be posted to the associated GNU Social account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry.') .'</p>';
+                       $s .= '<div id="statusnet-info" ><img id="statusnet-avatar" src="' . $details->profile_image_url . '" /><p id="statusnet-info-block">' . L10n::t('Currently connected to: ') . '<a href="' . $details->statusnet_profile_url . '" target="_statusnet">' . $details->screen_name . '</a><br /><em>' . $details->description . '</em></p></div>';
+                       $s .= '<p>' . L10n::t('If enabled all your <strong>public</strong> postings can be posted to the associated GNU Social account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry.') . '</p>';
                        if ($a->user['hidewall']) {
-                           $s .= '<p>'. t('<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to GNU Social will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted.') .'</p>';
+                               $s .= '<p>' . L10n::t('<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to GNU Social will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted.') . '</p>';
                        }
                        $s .= '<div id="statusnet-enable-wrapper">';
-                       $s .= '<label id="statusnet-enable-label" for="statusnet-checkbox">'. t('Allow posting to GNU Social') .'</label>';
+                       $s .= '<label id="statusnet-enable-label" for="statusnet-checkbox">' . L10n::t('Allow posting to GNU Social') . '</label>';
                        $s .= '<input id="statusnet-checkbox" type="checkbox" name="statusnet-enable" value="1" ' . $checked . '/>';
                        $s .= '<div class="clear"></div>';
-                       $s .= '<label id="statusnet-default-label" for="statusnet-default">'. t('Send public postings to GNU Social by default') .'</label>';
+                       $s .= '<label id="statusnet-default-label" for="statusnet-default">' . L10n::t('Send public postings to GNU Social by default') . '</label>';
                        $s .= '<input id="statusnet-default" type="checkbox" name="statusnet-default" value="1" ' . $defchecked . '/>';
                        $s .= '<div class="clear"></div>';
 
-                       $s .= '<label id="statusnet-mirror-label" for="statusnet-mirror">'.t('Mirror all posts from GNU Social that are no replies or repeated messages').'</label>';
-                       $s .= '<input id="statusnet-mirror" type="checkbox" name="statusnet-mirror" value="1" '. $mirrorchecked . '/>';
+                       $s .= '<label id="statusnet-mirror-label" for="statusnet-mirror">' . L10n::t('Mirror all posts from GNU Social that are no replies or repeated messages') . '</label>';
+                       $s .= '<input id="statusnet-mirror" type="checkbox" name="statusnet-mirror" value="1" ' . $mirrorchecked . '/>';
 
                        $s .= '<div class="clear"></div>';
                        $s .= '</div>';
 
-                       $s .= '<label id="statusnet-import-label" for="statusnet-import">'.t('Import the remote timeline').'</label>';
+                       $s .= '<label id="statusnet-import-label" for="statusnet-import">' . L10n::t('Import the remote timeline') . '</label>';
                        //$s .= '<input id="statusnet-import" type="checkbox" name="statusnet-import" value="1" '. $importchecked . '/>';
 
                        $s .= '<select name="statusnet-import" id="statusnet-import" />';
-                       $s .= '<option value="0" '.$importselected[0].'>'.t("Disabled").'</option>';
-                       $s .= '<option value="1" '.$importselected[1].'>'.t("Full Timeline").'</option>';
-                       $s .= '<option value="2" '.$importselected[2].'>'.t("Only Mentions").'</option>';
+                       $s .= '<option value="0" ' . $importselected[0] . '>' . L10n::t("Disabled") . '</option>';
+                       $s .= '<option value="1" ' . $importselected[1] . '>' . L10n::t("Full Timeline") . '</option>';
+                       $s .= '<option value="2" ' . $importselected[2] . '>' . L10n::t("Only Mentions") . '</option>';
                        $s .= '</select>';
                        $s .= '<div class="clear"></div>';
-/*
-                       $s .= '<label id="statusnet-create_user-label" for="statusnet-create_user">'.t('Automatically create contacts').'</label>';
-                       $s .= '<input id="statusnet-create_user" type="checkbox" name="statusnet-create_user" value="1" '. $create_userchecked . '/>';
-                       $s .= '<div class="clear"></div>';
-*/
+                       /*
+                         $s .= '<label id="statusnet-create_user-label" for="statusnet-create_user">'.L10n::t('Automatically create contacts').'</label>';
+                         $s .= '<input id="statusnet-create_user" type="checkbox" name="statusnet-create_user" value="1" '. $create_userchecked . '/>';
+                         $s .= '<div class="clear"></div>';
+                        */
                        $s .= '<div id="statusnet-disconnect-wrapper">';
-                       $s .= '<label id="statusnet-disconnect-label" for="statusnet-disconnect">'. t('Clear OAuth configuration') .'</label>';
+                       $s .= '<label id="statusnet-disconnect-label" for="statusnet-disconnect">' . L10n::t('Clear OAuth configuration') . '</label>';
                        $s .= '<input id="statusnet-disconnect" type="checkbox" name="statusnet-disconnect" value="1" />';
                        $s .= '</div><div class="clear"></div>';
-                       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+                       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="statusnet-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
                }
        }
        $s .= '</div><div class="clear"></div>';
@@ -578,50 +578,42 @@ function statusnet_post_hook(&$a,&$b) {
                if (statusnet_is_retweet($a, $b['uid'], $b['body']))
                        return;
 
-               require_once('include/bbcode.php');
-               $dent = new StatusNetOAuth($api,$ckey,$csecret,$otoken,$osecret);
+               $dent = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret);
                $max_char = $dent->get_maxlength(); // max. length for a dent
 
                set_pconfig($b['uid'], 'statusnet', 'max_char', $max_char);
 
                $tempfile = "";
-               require_once("include/plaintext.php");
-               require_once("include/network.php");
-               $msgarr = plaintext($a, $b, $max_char, true, 7);
+               $msgarr = BBCode::toPlaintext($b, $max_char, true, 7);
                $msg = $msgarr["text"];
 
                if (($msg == "") && isset($msgarr["title"]))
-                       $msg = shortenmsg($msgarr["title"], $max_char - 50);
+                       $msg = Plaintext::shorten($msgarr["title"], $max_char - 50);
 
                $image = "";
 
                if (isset($msgarr["url"]) && ($msgarr["type"] != "photo")) {
-                       if ((strlen($msgarr["url"]) > 20) &&
-                               ((strlen($msg." \n".$msgarr["url"]) > $max_char)))
-                               $msg .= " \n".short_link($msgarr["url"]);
-                       else
-                               $msg .= " \n".$msgarr["url"];
-               } elseif (isset($msgarr["image"]) && ($msgarr["type"] != "video"))
+                       $msg .= " \n" . $msgarr["url"];
+               } elseif (isset($msgarr["image"]) && ($msgarr["type"] != "video")) {
                        $image = $msgarr["image"];
 
                if ($image != "") {
-                       $img_str = fetch_url($image);
+                       $img_str = Network::fetchUrl($image);
                        $tempfile = tempnam(get_temppath(), "cache");
                        file_put_contents($tempfile, $img_str);
                        $postdata = array("status" => $msg, "media[]" => $tempfile);
                } else
                        $postdata = array("status"=>$msg);
 
-               // and now dent it :-)
-               if(strlen($msg)) {
-
+               // and now send it :-)
+               if (strlen($msg)) {
                        if ($iscomment) {
                                $postdata["in_reply_to_status_id"] = substr($orig_post["uri"], $hostlength);
                                logger('statusnet_post send reply '.print_r($postdata, true), LOGGER_DEBUG);
                        }
 
                        // New code that is able to post pictures
-                       require_once("addon/statusnet/codebird.php");
+                       require_once __DIR__ . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'codebirdsn.php';
                        $cb = \CodebirdSN\CodebirdSN::getInstance();
                        $cb->setAPIEndpoint($api);
                        $cb->setConsumerKey($ckey, $csecret);
@@ -637,12 +629,8 @@ function statusnet_post_hook(&$a,&$b) {
                        if ($result->error) {
                                logger('Send to GNU Social failed: "'.$result->error.'"');
                        } elseif ($iscomment) {
-                               logger('statusnet_post: Update extid '.$result->id." for post id ".$b['id']);
-                               q("UPDATE `item` SET `extid` = '%s', `body` = '%s' WHERE `id` = %d",
-                                       dbesc($hostname."::".$result->id),
-                                       dbesc($result->text),
-                                       intval($b['id'])
-                               );
+                               logger('statusnet_post: Update extid ' . $result->id . " for post id " . $b['id']);
+                               Item::update(['extid' => $hostname . "::" . $result->id, 'body' => $result->text], ['id' => $b['id']]);
                        }
                }
                if ($tempfile != "")
@@ -650,7 +638,9 @@ function statusnet_post_hook(&$a,&$b) {
        }
 }
 
-function statusnet_plugin_admin_post(&$a){
+function statusnet_addon_admin_post(App $a)
+{
+       $sites = [];
 
        $sites = array();
 
@@ -682,17 +672,17 @@ function statusnet_plugin_admin_post(&$a){
 
 }
 
-function statusnet_plugin_admin(&$a, &$o){
-
-       $sites = get_config('statusnet','sites');
-       $sitesform=array();
-       if (is_array($sites)){
-               foreach($sites as $id=>$s){
-                       $sitesform[] = Array(
-                               'sitename' => Array("sitename[$id]", "Site name", $s['sitename'], ""),
-                               'apiurl' => Array("apiurl[$id]", "Api url", $s['apiurl'], t("Base API Path \x28remember the trailing /\x29") ),
-                               'secret' => Array("secret[$id]", "Secret", $s['consumersecret'], ""),
-                               'key' => Array("key[$id]", "Key", $s['consumerkey'], ""),
+function statusnet_addon_admin(App $a, &$o)
+{
+       $sites = Config::get('statusnet', 'sites');
+       $sitesform = [];
+       if (is_array($sites)) {
+               foreach ($sites as $id => $s) {
+                       $sitesform[] = [
+                               'sitename' => ["sitename[$id]", "Site name", $s['sitename'], ""],
+                               'apiurl' => ["apiurl[$id]", "Api url", $s['apiurl'], L10n::t("Base API Path \x28remember the trailing /\x29")],
+                               'secret' => ["secret[$id]", "Secret", $s['consumersecret'], ""],
+                               'key' => ["key[$id]", "Key", $s['consumerkey'], ""],
                                //'applicationname' => Array("applicationname[$id]", "Application name", $s['applicationname'], ""),
                                'delete' => Array("delete[$id]", "Delete", False , "Check to delete this preset"),
                        );
@@ -700,17 +690,17 @@ function statusnet_plugin_admin(&$a, &$o){
        }
        /* empty form to add new site */
        $id++;
-       $sitesform[] = Array(
-               'sitename' => Array("sitename[$id]", t("Site name"), "", ""),
-               'apiurl' => Array("apiurl[$id]", "Api url", "", t("Base API Path \x28remember the trailing /\x29") ),
-               'secret' => Array("secret[$id]", t("Consumer Secret"), "", ""),
-               'key' => Array("key[$id]", t("Consumer Key"), "", ""),
-               //'applicationname' => Array("applicationname[$id]", t("Application name"), "", ""),
-       );
-
-       $t = get_markup_template( "admin.tpl", "addon/statusnet/" );
-       $o = replace_macros($t, array(
-               '$submit' => t('Save Settings'),
+       $sitesform[] = [
+               'sitename' => ["sitename[$id]", L10n::t("Site name"), "", ""],
+               'apiurl' => ["apiurl[$id]", "Api url", "", L10n::t("Base API Path \x28remember the trailing /\x29")],
+               'secret' => ["secret[$id]", L10n::t("Consumer Secret"), "", ""],
+               'key' => ["key[$id]", L10n::t("Consumer Key"), "", ""],
+               //'applicationname' => Array("applicationname[$id]", L10n::t("Application name"), "", ""),
+       ];
+
+       $t = get_markup_template("admin.tpl", "addon/statusnet/");
+       $o = replace_macros($t, [
+               '$submit' => L10n::t('Save Settings'),
                '$sites' => $sitesform,
        ));
 }
@@ -724,9 +714,8 @@ function statusnet_prepare_body(&$a,&$b) {
                if (intval($max_char) == 0)
                        $max_char = 140;
 
-                require_once("include/plaintext.php");
-                $item = $b["item"];
-                $item["plink"] = $a->get_baseurl()."/display/".$a->user["nickname"]."/".$item["parent"];
+               $item = $b["item"];
+               $item["plink"] = $a->get_baseurl() . "/display/" . $a->user["nickname"] . "/" . $item["parent"];
 
                $r = q("SELECT `item`.`author-link`, `item`.`uri`, `contact`.`nick` AS contact_nick
                         FROM `item` INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
@@ -748,6 +737,8 @@ function statusnet_prepare_body(&$a,&$b) {
                                $item["body"] = $nickname." ".$item["body"];
                 }
 
+               $msgarr = BBCode::toPlaintext($item, $max_char, true, 7);
+               $msg = $msgarr["text"];
 
                 $msgarr = plaintext($a, $item, $max_char, true, 7);
                 $msg = $msgarr["text"];
@@ -790,7 +781,7 @@ function statusnet_cron($a,$b) {
        if ($abandon_days < 1)
                $abandon_days = 0;
 
-       $abandon_limit = date("Y-m-d H:i:s", time() - $abandon_days * 86400);
+       $abandon_limit = date(DateTimeFormat::MYSQL, time() - $abandon_days * 86400);
 
        $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'statusnet' AND `k` = 'import' AND `v` ORDER BY RAND()");
        if(count($r)) {
@@ -950,7 +941,7 @@ function statusnet_fetch_contact($uid, $contact, $create_user) {
                                        `location`, `about`, `writable`, `blocked`, `readonly`, `pending` )
                                        VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', %d, 0, 0, 0 ) ",
                        intval($uid),
-                       dbesc(datetime_convert()),
+                       dbesc(DateTimeFormat::utcNow()),
                        dbesc($contact->statusnet_profile_url),
                        dbesc(normalise_link($contact->statusnet_profile_url)),
                        dbesc(statusnet_address($contact)),
@@ -999,14 +990,13 @@ function statusnet_fetch_contact($uid, $contact, $create_user) {
                        dbesc($photos[0]),
                        dbesc($photos[1]),
                        dbesc($photos[2]),
-                       dbesc(datetime_convert()),
+                       dbesc(DateTimeFormat::utcNow()),
                        intval($contact_id)
                );
        } else {
                // update profile photos once every two weeks as we have no notification of when they change.
-
-               //$update_photo = (($r[0]['avatar-date'] < datetime_convert('','','now -2 days')) ? true : false);
-               $update_photo = ($r[0]['avatar-date'] < datetime_convert('','','now -12 hours'));
+               //$update_photo = (($r[0]['avatar-date'] < DateTimeFormat::convert('now -2 days', '', '', )) ? true : false);
+               $update_photo = ($r[0]['avatar-date'] < DateTimeFormat::utc('now -12 hours'));
 
                // check that we have all the photos, this has been known to fail on occasion
 
@@ -1035,9 +1025,9 @@ function statusnet_fetch_contact($uid, $contact, $create_user) {
                                dbesc($photos[0]),
                                dbesc($photos[1]),
                                dbesc($photos[2]),
-                               dbesc(datetime_convert()),
-                               dbesc(datetime_convert()),
-                               dbesc(datetime_convert()),
+                               dbesc(DateTimeFormat::utcNow()),
+                               dbesc(DateTimeFormat::utcNow()),
+                               dbesc(DateTimeFormat::utcNow()),
                                dbesc($contact->statusnet_profile_url),
                                dbesc(normalise_link($contact->statusnet_profile_url)),
                                dbesc(statusnet_address($contact)),
@@ -1060,9 +1050,9 @@ function statusnet_fetchuser($a, $uid, $screen_name = "", $user_id = "") {
        $otoken  = get_pconfig($uid, 'statusnet', 'oauthtoken');
        $osecret = get_pconfig($uid, 'statusnet', 'oauthsecret');
 
-       require_once("addon/statusnet/codebird.php");
+       require_once __DIR__ . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'codebirdsn.php';
 
-       $cb = \Codebird\Codebird::getInstance();
+       $cb = \CodebirdSN\CodebirdSN::getInstance();
        $cb->setConsumerKey($ckey, $csecret);
        $cb->setToken($otoken, $osecret);
 
@@ -1215,8 +1205,8 @@ function statusnet_createpost($a, $uid, $post, $self, $create_user, $only_existi
        $postarray['body'] = $converted["body"];
        $postarray['tag'] = $converted["tags"];
 
-       $postarray['created'] = datetime_convert('UTC','UTC',$content->created_at);
-       $postarray['edited'] = datetime_convert('UTC','UTC',$content->created_at);
+       $postarray['created'] = DateTimeFormat::utc($content->created_at);
+       $postarray['edited'] = DateTimeFormat::utc($content->created_at);
 
        if (is_string($content->place->name))
                $postarray["location"] = $content->place->name;
@@ -1295,14 +1285,14 @@ function statusnet_checknotification($a, $uid, $own_url, $top_item, $postarray)
                        notification(array(
                                'type'         => NOTIFY_COMMENT,
                                'notify_flags' => $user[0]['notify-flags'],
-                               'language'     => $user[0]['language'],
-                               'to_name'      => $user[0]['username'],
-                               'to_email'     => $user[0]['email'],
-                               'uid'          => $user[0]['uid'],
-                               'item'         => $postarray,
-                               'link'         => $a->get_baseurl().'/display/'.urlencode(get_item_guid($top_item)),
-                               'source_name'  => $postarray['author-name'],
-                               'source_link'  => $postarray['author-link'],
+                               'language' => $user[0]['language'],
+                               'to_name' => $user[0]['username'],
+                               'to_email' => $user[0]['email'],
+                               'uid' => $user[0]['uid'],
+                               'item' => $postarray,
+                               'link' => $a->get_baseurl() . '/display/' . urlencode(Item::getGuidById($top_item)),
+                               'source_name' => $postarray['author-name'],
+                               'source_link' => $postarray['author-link'],
                                'source_photo' => $postarray['author-avatar'],
                                'verb'         => ACTIVITY_POST,
                                'otype'        => 'item',
@@ -1330,8 +1320,7 @@ function statusnet_fetchhometimeline($a, $uid, $mode = 1) {
 
        logger("statusnet_fetchhometimeline: Fetching for user ".$uid, LOGGER_DEBUG);
 
-       require_once('library/twitteroauth.php');
-       require_once('include/items.php');
+       require_once 'include/items.php';
 
        $connection = new StatusNetOAuth($api, $ckey,$csecret,$otoken,$osecret);
 
@@ -1418,7 +1407,7 @@ function statusnet_fetchhometimeline($a, $uid, $mode = 1) {
                                        if (trim($postarray['body']) == "")
                                                continue;
 
-                                       $item = item_store($postarray);
+                                       $item = Item::insert($postarray);
                                        $postarray["id"] = $item;
 
                                        logger('statusnet_fetchhometimeline: User '.$self["nick"].' posted home timeline item '.$item);
@@ -1469,8 +1458,8 @@ function statusnet_fetchhometimeline($a, $uid, $mode = 1) {
                                if (trim($postarray['body']) != "") {
                                        continue;
 
-                                       $item = item_store($postarray);
-                                       $postarray["id"] = $item;
+                               $item = Item::insert($postarray);
+                               $postarray["id"] = $item;
 
                                        logger('statusnet_fetchhometimeline: User '.$self["nick"].' posted mention timeline item '.$item);
 
@@ -1498,7 +1487,7 @@ function statusnet_fetchhometimeline($a, $uid, $mode = 1) {
                                        'to_email'     => $u[0]['email'],
                                        'uid'          => $u[0]['uid'],
                                        'item'         => $postarray,
-                                       'link'         => $a->get_baseurl().'/display/'.urlencode(get_item_guid($item)),
+                                       'link'         => $a->get_baseurl() . '/display/' . urlencode(Item::getGuidById($item)),
                                        'source_name'  => $postarray['author-name'],
                                        'source_link'  => $postarray['author-link'],
                                        'source_photo' => $postarray['author-avatar'],
@@ -1521,9 +1510,7 @@ function statusnet_complete_conversation($a, $uid, $self, $create_user, $nick, $
        $osecret = get_pconfig($uid, 'statusnet', 'oauthsecret');
        $own_url = get_pconfig($uid, 'statusnet', 'own_url');
 
-       require_once('library/twitteroauth.php');
-
-       $connection = new StatusNetOAuth($api, $ckey,$csecret,$otoken,$osecret);
+       $connection = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret);
 
        $parameters["count"] = 200;
 
@@ -1531,14 +1518,13 @@ function statusnet_complete_conversation($a, $uid, $self, $create_user, $nick, $
        if (is_array($items)) {
                $posts = array_reverse($items);
 
-               foreach($posts AS $post) {
+               foreach ($posts as $post) {
                        $postarray = statusnet_createpost($a, $uid, $post, $self, false, false);
 
                        if (trim($postarray['body']) == "")
                                continue;
 
-                       //print_r($postarray);
-                       $item = item_store($postarray);
+                       $item = Item::insert($postarray);
                        $postarray["id"] = $item;
 
                        logger('statusnet_complete_conversation: User '.$self["nick"].' posted home timeline item '.$item);
@@ -1549,11 +1535,9 @@ function statusnet_complete_conversation($a, $uid, $self, $create_user, $nick, $
        }
 }
 
-function statusnet_convertmsg($a, $body, $no_tags = false) {
-
-       require_once("include/oembed.php");
-       require_once("include/items.php");
-       require_once("include/network.php");
+function statusnet_convertmsg(App $a, $body, $no_tags = false)
+{
+       require_once "include/items.php";
 
        $body = preg_replace("=\[url\=https?://([0-9]*).([0-9]*).([0-9]*).([0-9]*)/([0-9]*)\](.*?)\[\/url\]=ism","$1.$2.$3.$4/$5",$body);
 
@@ -1571,7 +1555,7 @@ function statusnet_convertmsg($a, $body, $no_tags = false) {
 
                        logger("statusnet_convertmsg: expanding url ".$match[1], LOGGER_DEBUG);
 
-                       $expanded_url = original_url($match[1]);
+                       $expanded_url = Network::finalUrl($match[1]);
 
                        logger("statusnet_convertmsg: fetching data for ".$expanded_url, LOGGER_DEBUG);
 
@@ -1588,12 +1572,12 @@ function statusnet_convertmsg($a, $body, $no_tags = false) {
                                $footerlink = "[url=".$expanded_url."]".$expanded_url."[/url]";
 
                                $body = str_replace($search, $footerlink, $body);
-                       } elseif (($oembed_data->type == "photo") && isset($oembed_data->url) && !$dontincludemedia)
-                               $body = str_replace($search, "[url=".$expanded_url."][img]".$oembed_data->url."[/img][/url]", $body);
-                       elseif ($oembed_data->type != "link")
-                               $body = str_replace($search,  "[url=".$expanded_url."]".$expanded_url."[/url]", $body);
-                       else {
-                               $img_str = fetch_url($expanded_url, true, $redirects, 4);
+                       } elseif (($oembed_data->type == "photo") && isset($oembed_data->url) && !$dontincludemedia) {
+                               $body = str_replace($search, "[url=" . $expanded_url . "][img]" . $oembed_data->url . "[/img][/url]", $body);
+                       } elseif ($oembed_data->type != "link") {
+                               $body = str_replace($search, "[url=" . $expanded_url . "]" . $expanded_url . "[/url]", $body);
+                       else {
+                               $img_str = Network::fetchUrl($expanded_url, true, $redirects, 4);
 
                                $tempfile = tempnam(get_temppath(), "cache");
                                file_put_contents($tempfile, $img_str);
@@ -1667,9 +1651,7 @@ function statusnet_fetch_own_contact($a, $uid) {
        $contact_id = 0;
 
        if ($own_url == "") {
-               require_once('library/twitteroauth.php');
-
-               $connection = new StatusNetOAuth($api, $ckey,$csecret,$otoken,$osecret);
+               $connection = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret);
 
                // Fetching user data
                $user = $connection->get('account/verify_credentials');
index 19d2c53b7c7a9074cd85aa346a00d4faaabd3b4e..698500cb4d696933c1f8cb19f99f61b357f8c4b8 100644 (file)
@@ -1,16 +1,16 @@
-# ADDON blockem
+# ADDON superblock
 # Copyright (C)
-# This file is distributed under the same license as the Friendica blockem addon package.
+# This file is distributed under the same license as the Friendica superblock addon package.
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2017
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:28+0000\n"
+"POT-Creation-Date: 2017-04-21 08:45+0200\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -19,35 +19,26 @@ msgstr ""
 "Language: it\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: blockem.php:51
-msgid "\"Blockem\" Settings"
-msgstr "Impostazioni \"Blockem\""
+#: superblock.php:53 superblock.php:57
+msgid "\"Superblock\""
+msgstr "\"Superblocco\""
 
-#: blockem.php:53
+#: superblock.php:60
 msgid "Comma separated profile URLS to block"
 msgstr "Lista, separata da virgola, di indirizzi di profili da bloccare"
 
-#: blockem.php:57
-msgid "Submit"
-msgstr "Invia"
+#: superblock.php:64
+msgid "Save Settings"
+msgstr "Salva Impostazioni"
 
-#: blockem.php:70
-msgid "BLOCKEM Settings saved."
-msgstr "Impostazioni \"Blockem\" salvate."
+#: superblock.php:76
+msgid "SUPERBLOCK Settings saved."
+msgstr "Impostazioni \"Superblocco\" salvate."
 
-#: blockem.php:105
-#, php-format
-msgid "Blocked %s - Click to open/close"
-msgstr "%s bloccato - Clicca per aprire/chiudere"
+#: superblock.php:148
+msgid "Block Completely"
+msgstr "Blocca Completamente"
 
-#: blockem.php:160
-msgid "Unblock Author"
-msgstr "Sblocca autore"
-
-#: blockem.php:162
-msgid "Block Author"
-msgstr "Blocca autore"
-
-#: blockem.php:194
-msgid "blockem settings updated"
-msgstr "Impostazioni 'blockem' aggiornate."
+#: superblock.php:168
+msgid "superblock settings updated"
+msgstr "impostazioni \"superblocco\" aggiornate."
index 74d55e1665844153e78840011292fcff3c508078..968de3cc69eab453a43ce0e4112da3f5a2568230 100644 (file)
@@ -5,11 +5,9 @@ function string_plural_select_it($n){
        return ($n != 1);;
 }}
 ;
-$a->strings["\"Blockem\" Settings"] = "Impostazioni \"Blockem\"";
+$a->strings["\"Superblock\""] = "\"Superblocco\"";
 $a->strings["Comma separated profile URLS to block"] = "Lista, separata da virgola, di indirizzi di profili da bloccare";
-$a->strings["Submit"] = "Invia";
-$a->strings["BLOCKEM Settings saved."] = "Impostazioni \"Blockem\" salvate.";
-$a->strings["Blocked %s - Click to open/close"] = "%s bloccato - Clicca per aprire/chiudere";
-$a->strings["Unblock Author"] = "Sblocca autore";
-$a->strings["Block Author"] = "Blocca autore";
-$a->strings["blockem settings updated"] = "Impostazioni 'blockem' aggiornate.";
+$a->strings["Save Settings"] = "Salva Impostazioni";
+$a->strings["SUPERBLOCK Settings saved."] = "Impostazioni \"Superblocco\" salvate.";
+$a->strings["Block Completely"] = "Blocca Completamente";
+$a->strings["superblock settings updated"] = "impostazioni \"superblocco\" aggiornate.";
index c86c6aadc7950635703bbced3789e2c0eaade93f..1c9dab7cabcad188df3562a40c325281ae816646 100644 (file)
@@ -8,25 +8,28 @@
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
  *
  */
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 function superblock_install() {
 
-       register_hook('plugin_settings', 'addon/superblock/superblock.php', 'superblock_addon_settings');
-       register_hook('plugin_settings_post', 'addon/superblock/superblock.php', 'superblock_addon_settings_post');
-       register_hook('conversation_start', 'addon/superblock/superblock.php', 'superblock_conversation_start');
-       register_hook('item_photo_menu', 'addon/superblock/superblock.php', 'superblock_item_photo_menu');
-       register_hook('enotify_store', 'addon/superblock/superblock.php', 'superblock_enotify_store');
+       Addon::registerHook('addon_settings', 'addon/superblock/superblock.php', 'superblock_addon_settings');
+       Addon::registerHook('addon_settings_post', 'addon/superblock/superblock.php', 'superblock_addon_settings_post');
+       Addon::registerHook('conversation_start', 'addon/superblock/superblock.php', 'superblock_conversation_start');
+       Addon::registerHook('item_photo_menu', 'addon/superblock/superblock.php', 'superblock_item_photo_menu');
+       Addon::registerHook('enotify_store', 'addon/superblock/superblock.php', 'superblock_enotify_store');
 
 }
 
 
 function superblock_uninstall() {
 
-       unregister_hook('plugin_settings', 'addon/superblock/superblock.php', 'superblock_addon_settings');
-       unregister_hook('plugin_settings_post', 'addon/superblock/superblock.php', 'superblock_addon_settings_post');
-       unregister_hook('conversation_start', 'addon/superblock/superblock.php', 'superblock_conversation_start');
-       unregister_hook('item_photo_menu', 'addon/superblock/superblock.php', 'superblock_item_photo_menu');
-       unregister_hook('enotify_store', 'addon/superblock/superblock.php', 'superblock_enotify_store');
+       Addon::unregisterHook('addon_settings', 'addon/superblock/superblock.php', 'superblock_addon_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/superblock/superblock.php', 'superblock_addon_settings_post');
+       Addon::unregisterHook('conversation_start', 'addon/superblock/superblock.php', 'superblock_conversation_start');
+       Addon::unregisterHook('item_photo_menu', 'addon/superblock/superblock.php', 'superblock_item_photo_menu');
+       Addon::unregisterHook('enotify_store', 'addon/superblock/superblock.php', 'superblock_enotify_store');
 
 }
 
@@ -50,18 +53,18 @@ function superblock_addon_settings(&$a,&$s) {
        }
 
        $s .= '<span id="settings_superblock_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_superblock_expanded\'); openClose(\'settings_superblock_inflated\');">';
-       $s .= '<h3>' . t('"Superblock"') . '</h3>';
+       $s .= '<h3>' . L10n::t('"Superblock"') . '</h3>';
        $s .= '</span>';
        $s .= '<div id="settings_superblock_expanded" class="settings-block" style="display: none;">';
        $s .= '<span class="fakelink" onclick="openClose(\'settings_superblock_expanded\'); openClose(\'settings_superblock_inflated\');">';
-       $s .= '<h3>' . t('"Superblock"') . '</h3>';
+       $s .= '<h3>' . L10n::t('"Superblock"') . '</h3>';
        $s .= '</span>';
        $s .= '<div id="superblock-wrapper">';
-       $s .= '<label id="superblock-label" for="superblock-words">' . t('Comma separated profile URLS to block') . ' </label>';
+       $s .= '<label id="superblock-label" for="superblock-words">' . L10n::t('Comma separated profile URLS to block') . ' </label>';
        $s .= '<textarea id="superblock-words" type="text" name="superblock-words" >' . htmlspecialchars($words) . '</textarea>';
        $s .= '</div><div class="clear"></div>';
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="superblock-submit" name="superblock-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="superblock-submit" name="superblock-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
        return;
 }
@@ -72,8 +75,8 @@ function superblock_addon_settings_post(&$a,&$b) {
                return;
 
        if($_POST['superblock-submit']) {
-               set_pconfig(local_user(),'system','blocked',trim($_POST['superblock-words']));
-               info( t('SUPERBLOCK Settings saved.') . EOL);
+               PConfig::set(local_user(),'system','blocked',trim($_POST['superblock-words']));
+               info(L10n::t('SUPERBLOCK Settings saved.') . EOL);
        }
 }
 
@@ -145,7 +148,7 @@ function superblock_item_photo_menu(&$a,&$b) {
                }
        }
 
-       $b['menu'][ t('Block Completely')] = 'javascript:superblockBlock(\'' . $author . '\'); return false;';
+       $b['menu'][L10n::t('Block Completely')] = 'javascript:superblockBlock(\'' . $author . '\'); return false;';
 }
 
 function superblock_module() {}
@@ -164,7 +167,7 @@ function superblock_init(&$a) {
                $words .= trim($_GET['block']);
        }
 
-       set_pconfig(local_user(),'system','blocked',$words);
-       info( t('superblock settings updated') . EOL );
+       PConfig::set(local_user(),'system','blocked',$words);
+       info(L10n::t('superblock settings updated') . EOL );
        killme();
 }
index 3d735dea95a220fc7db4b97f81245a3da18a5904..edc63ed57c5939857f391e6fd6242ea9e960ed22 100644 (file)
@@ -2,7 +2,7 @@ TestDrive
 =========
 
 
-Testdrive is a Friendica plugin which implements automatic account expiration so that a site may be used as a public
+Testdrive is a Friendica addon which implements automatic account expiration so that a site may be used as a public
 test bed. 
 
 When an account is created on the site, it is given a hard expiration date of 
@@ -11,11 +11,11 @@ When an account is created on the site, it is given a hard expiration date of
 $a->config['testdrive']['expiredays'] = 30;
 
 Set this in your .htconfig.php file to allow a 30 day test drive period. By default no expiration period is defined 
-in case the plugin is activated accidentally. 
+in case the addon is activated accidentally. 
 
 
-There is no opportunity to extend an expired account using this plugin. Expiration is final. Other plugins may be created
-which charge for service and extend the expiration as long as a balance is maintained. This plugin is purely for creating
+There is no opportunity to extend an expired account using this addon. Expiration is final. Other addons may be created
+which charge for service and extend the expiration as long as a balance is maintained. This addon is purely for creating
 a limited use test site. 
 
 An email warning will be sent out approximately five days before the expiration occurs. Once it occurs logins and many 
index d929c4fd4e4160801e51d304f2fa6be02a91bcaa..49e3d95b4d56766ebcd54012e7950515bb696f95 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2015-08-23 17:30+0200\n"
-"PO-Revision-Date: 2015-08-31 10:28+0000\n"
+"PO-Revision-Date: 2017-09-20 06:08+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index 9bbeb1d854b11cda874d6aa1277c026105d05338..4398ffbf9cb98575f32115fc62ec871bc80b5a14 100644 (file)
@@ -1,31 +1,33 @@
 <?php
-
 /**
  * Name: testdrive
- * Description: Sample Friendica plugin/addon for creating a test drive Friendica site with automatic account expiration.
+ * Description: Sample Friendica addon for creating a test drive Friendica site with automatic account expiration.
  * Version: 1.0
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
  */
 
-
-
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Model\User;
+use Friendica\Util\DateTimeFormat;
 
 function testdrive_install() {
 
-       register_hook('register_account', 'addon/testdrive/testdrive.php', 'testdrive_register_account');
-       register_hook('cron', 'addon/testdrive/testdrive.php', 'testdrive_cron');
-       register_hook('enotify','addon/testdrive/testdrive.php', 'testdrive_enotify');
-       register_hook('globaldir_update','addon/testdrive/testdrive.php', 'testdrive_globaldir_update');
+       Addon::registerHook('register_account', 'addon/testdrive/testdrive.php', 'testdrive_register_account');
+       Addon::registerHook('cron', 'addon/testdrive/testdrive.php', 'testdrive_cron');
+       Addon::registerHook('enotify','addon/testdrive/testdrive.php', 'testdrive_enotify');
+       Addon::registerHook('globaldir_update','addon/testdrive/testdrive.php', 'testdrive_globaldir_update');
 
 }
 
 
 function testdrive_uninstall() {
 
-       unregister_hook('register_account', 'addon/testdrive/testdrive.php', 'testdrive_register_account');
-       unregister_hook('cron', 'addon/testdrive/testdrive.php', 'testdrive_cron');
-       unregister_hook('enotify','addon/testdrive/testdrive.php', 'testdrive_enotify');
-       unregister_hook('globaldir_update','addon/testdrive/testdrive.php', 'testdrive_globaldir_update');
+       Addon::unregisterHook('register_account', 'addon/testdrive/testdrive.php', 'testdrive_register_account');
+       Addon::unregisterHook('cron', 'addon/testdrive/testdrive.php', 'testdrive_cron');
+       Addon::unregisterHook('enotify','addon/testdrive/testdrive.php', 'testdrive_enotify');
+       Addon::unregisterHook('globaldir_update','addon/testdrive/testdrive.php', 'testdrive_globaldir_update');
 
 }
 
@@ -42,7 +44,7 @@ function testdrive_register_account($a,$b) {
                return;
 
        $r = q("UPDATE user set account_expires_on = '%s' where uid = %d",
-               dbesc(datetime_convert('UTC','UTC','now +' . $days . ' days')),
+               dbesc(DateTimeFormat::convert('now +' . $days . ' days')),
                intval($uid)
        );
 
@@ -64,13 +66,13 @@ function testdrive_cron($a,$b) {
                                'language'     => $rr['language'],
                                'to_name'      => $rr['username'],
                                'to_email'     => $rr['email'],
-                               'source_name'  => t('Administrator'),
+                               'source_name'  => L10n::t('Administrator'),
                                'source_link'  => $a->get_baseurl(),
                                'source_photo' => $a->get_baseurl() . '/images/person-80.jpg',
                        ));
 
                        q("update user set expire_notification_sent = '%s' where uid = %d",
-                               dbesc(datetime_convert()),
+                               dbesc(DateTimeFormat::utcNow()),
                                intval($rr['uid'])
                        );
 
@@ -91,8 +93,8 @@ function testdrive_enotify(&$a, &$b) {
     if (x($b, 'params') && $b['params']['type'] == NOTIFY_SYSTEM
                && x($b['params'], 'system_type') && $b['params']['system_type'] === 'testdrive_expire') {
         $b['itemlink'] = $a->get_baseurl();
-        $b['epreamble'] = $b['preamble'] = sprintf( t('Your account on %s will expire in a few days.'), get_config('system','sitename'));
-        $b['subject'] = t('Your Friendica test account is about to expire.');
-        $b['body'] = sprintf( t("Hi %1\$s,\n\nYour test account on %2\$s will expire in less than five days. We hope you enjoyed this test drive and use this opportunity to find a permanent Friendica website for your integrated social communications. A list of public sites is available at %s/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com."), $b['params']['to_name'], "[url=".$app->config["system"]["url"]."]".$app->config["sitename"]."[/url]", get_server());
+        $b['epreamble'] = $b['preamble'] = L10n::t('Your account on %s will expire in a few days.', Config::get('system', 'sitename'));
+        $b['subject'] = L10n::t('Your Friendica test account is about to expire.');
+        $b['body'] = L10n::t("Hi %1\$s,\n\nYour test account on %2\$s will expire in less than five days. We hope you enjoyed this test drive and use this opportunity to find a permanent Friendica website for your integrated social communications. A list of public sites is available at %s/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com.", $b['params']['to_name'], "[url=".$app->config["system"]["url"]."]".$app->config["sitename"]."[/url]", get_server());
     }
 }
index 4e365574fdf882588640c94fdedb7959ec3e96b5..fc0458f1347ab10bccfa186e4637522cdf119643 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2014-09-10 14:43+0000\n"
+"PO-Revision-Date: 2017-09-20 06:09+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index 1dd1ccb0e90099a937ed0837eb6cad9d256ea3be..ffea3c2648861b35010e1da76c99d4a2c4fcca20 100644 (file)
@@ -5,19 +5,20 @@
  * Version: 1.0
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
  */
-
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
 
 function tictac_install() {
-       register_hook('app_menu', 'addon/tictac/tictac.php', 'tictac_app_menu');
+       Addon::registerHook('app_menu', 'addon/tictac/tictac.php', 'tictac_app_menu');
 }
 
 function tictac_uninstall() {
-       unregister_hook('app_menu', 'addon/tictac/tictac.php', 'tictac_app_menu');
+       Addon::unregisterHook('app_menu', 'addon/tictac/tictac.php', 'tictac_app_menu');
 
 }
 
 function tictac_app_menu($a,&$b) {
-       $b['app_menu'][] = '<div class="app-title"><a href="tictac">' . t('Three Dimensional Tic-Tac-Toe') . '</a></div>'; 
+       $b['app_menu'][] = '<div class="app-title"><a href="tictac">' . L10n::t('Three Dimensional Tic-Tac-Toe') . '</a></div>';
 }
 
 
@@ -50,17 +51,17 @@ function tictac_content(&$a) {
    $dimen = 3;
   }
 
-  $o .=  '<h3>' . t('3D Tic-Tac-Toe') . '</h3><br />';
+  $o .=  '<h3>' . L10n::t('3D Tic-Tac-Toe') . '</h3><br />';
 
   $t = new tictac($dimen,$handicap,$mefirst,$yours,$mine);
   $o .= $t->play();
 
-  $o .=  '<a href="tictac">' . t('New game') . '</a><br />';
-  $o .=  '<a href="tictac/1">' . t('New game with handicap') . '</a><br />';
-  $o .=  '<p>' . t('Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. ');
-  $o .= t('In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels.');
-  $o .= '</p><p>'; 
-  $o .= t('The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage.');
+  $o .=  '<a href="tictac">' . L10n::t('New game') . '</a><br />';
+  $o .=  '<a href="tictac/1">' . L10n::t('New game with handicap') . '</a><br />';
+  $o .=  '<p>' . L10n::t('Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. ');
+  $o .= L10n::t('In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels.');
+  $o .= '</p><p>';
+  $o .= L10n::t('The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage.');
   $o .= '</p>';
 
   return $o;
@@ -179,24 +180,24 @@ class tictac {
 
      if($this->first_move) {
        if(rand(0,1) == 1) {
-         $o .=  '<div class="error-message">' . t('You go first...') . '</div><br />';
+         $o .=  '<div class="error-message">' . L10n::t('You go first...') . '</div><br />';
          $this->mefirst = 0;
          $o .= $this->draw_board();
          return $o;
        }
-       $o .=  '<div class="error-message">' . t('I\'m going first this time...') . ' </div><br />';
+       $o .=  '<div class="error-message">' . L10n::t('I\'m going first this time...') . ' </div><br />';
        $this->mefirst = 1;
 
      }
 
      if($this->check_youwin()) {
-       $o .=  '<div class="error-message">' . t('You won!') . '</div><br />';
+       $o .=  '<div class="error-message">' . L10n::t('You won!') . '</div><br />';
        $o .= $this->draw_board();
        return $o;
      }
 
      if($this->fullboard())
-       $o .=  '<div class="error-message">' . t('"Cat" game!') . '</div><br />';
+       $o .=  '<div class="error-message">' . L10n::t('"Cat" game!') . '</div><br />';
 
      $move = $this->winning_move();
      if(strlen($move)) {
@@ -219,9 +220,9 @@ class tictac {
      }
 
      if($this->check_iwon())
-       $o .=  '<div class="error-message">' . t('I won!') . '</div><br />';
+       $o .=  '<div class="error-message">' . L10n::t('I won!') . '</div><br />';
      if($this->fullboard())
-       $o .=  '<div class="error-message">' . t('"Cat" game!') . '</div><br />';
+       $o .=  '<div class="error-message">' . L10n::t('"Cat" game!') . '</div><br />';
      $o .= $this->draw_board();
        return $o;
   }
index fb20dac28712194cd1a79c60948832fbe511d388..57ca145a07f1ec922308a804513aa19f636fd1b6 100644 (file)
@@ -4,7 +4,7 @@ Installation
 [Register](http://www.tumblr.com/oauth/apps) an application and use (your server name)/addon/tumblr/callback.php as 
 callback URL
 
-After the registration please enter the values for "Consumer Key" and "Consumer Secret" in the [administration](admin/plugins/tumblr).
+After the registration please enter the values for "Consumer Key" and "Consumer Secret" in the [administration](admin/addons/tumblr).
 
 Notice
 ------
index b826c03037dca8a9d7fbd46aea07dd9ab60255e7..d2e4a909c14c24ad0db0d9714414e7490f63a626 100644 (file)
@@ -42,7 +42,7 @@ msgid "(Re-)Authenticate your tumblr page"
 msgstr ""
 
 #: tumblr.php:192
-msgid "Enable Tumblr Post Plugin"
+msgid "Enable Tumblr Post Addon"
 msgstr ""
 
 #: tumblr.php:197
index b1766618dd7a8fee5b0a2a4f3fad3f5b1feb4b11..9ded80d22ea2968ec2ab6287aef9e61b117c8ff8 100644 (file)
@@ -6,7 +6,7 @@ $a->strings["return to the connector page"] = "";
 $a->strings["Post to Tumblr"] = "Publica-ho al Tumblr";\r
 $a->strings["Tumblr Post Settings"] = "Configuració d'Enviaments de Tumblr";\r
 $a->strings["(Re-)Authenticate your tumblr page"] = "";\r
-$a->strings["Enable Tumblr Post Plugin"] = "Habilita el plugin de enviaments de Tumblr";\r
+$a->strings["Enable Tumblr Post Addon"] = "Habilita el addon de enviaments de Tumblr";\r
 $a->strings["Post to Tumblr by default"] = "Enviar a Tumblr per defecte";\r
 $a->strings["Post to page:"] = "";\r
 $a->strings["You are not authenticated to tumblr"] = "";\r
index 83d24f701e26738e9cc8841b2d23cb7a5cacb7fd..a084ca65950c9843e4c5f0baa7e0a50ba4212d0c 100644 (file)
@@ -44,7 +44,7 @@ msgid "(Re-)Authenticate your tumblr page"
 msgstr "(Znovu) přihlásit k Vaší tumblr stránce"
 
 #: tumblr.php:198
-msgid "Enable Tumblr Post Plugin"
+msgid "Enable Tumblr Post Addon"
 msgstr "Povolit rozšíření Tumbir"
 
 #: tumblr.php:203
index 43673188414eb3383f89d10eaeb2e16ab3592160..8a8741d23fff584cc49532e4c683f8476a7dd8e7 100644 (file)
@@ -11,7 +11,7 @@ $a->strings["return to the connector page"] = "návrat ke stránce konektor";
 $a->strings["Post to Tumblr"] = "Příspěvek na Tumbir";
 $a->strings["Tumblr Export"] = "Tumbir export";
 $a->strings["(Re-)Authenticate your tumblr page"] = "(Znovu) přihlásit k Vaší tumblr stránce";
-$a->strings["Enable Tumblr Post Plugin"] = "Povolit rozšíření Tumbir";
+$a->strings["Enable Tumblr Post Addon"] = "Povolit rozšíření Tumbir";
 $a->strings["Post to Tumblr by default"] = "Standardně posílat příspěvky na Tumbir";
 $a->strings["Post to page:"] = "Příspěvek ke stránce:";
 $a->strings["You are not authenticated to tumblr"] = "Nyní nejste přihlášen k tumblr.";
index d40400020c6c53f4f920db082516d4f615226b98..aa3c16cf76f8bfed74ba3774200bebcfc13f348e 100644 (file)
@@ -44,8 +44,8 @@ msgid "(Re-)Authenticate your tumblr page"
 msgstr "(Re-)Authentifizierung deiner tumblr Seite"
 
 #: tumblr.php:192
-msgid "Enable Tumblr Post Plugin"
-msgstr "Tumblr-Post-Plugin aktivieren"
+msgid "Enable Tumblr Post Addon"
+msgstr "Tumblr-Post-Addon aktivieren"
 
 #: tumblr.php:197
 msgid "Post to Tumblr by default"
index 9ba399870e057ff42aa60c6dce6111e4d6b5a720..87fd5c5043bb0a61bceb41cd5c84fe31189bf885 100644 (file)
@@ -11,7 +11,7 @@ $a->strings["return to the connector page"] = "zurück zur Connector Seite";
 $a->strings["Post to Tumblr"] = "Auf Tumblr veröffentlichen";
 $a->strings["Tumblr Post Settings"] = "Tumblr-Beitragseinstellungen";
 $a->strings["(Re-)Authenticate your tumblr page"] = "(Re-)Authentifizierung deiner tumblr Seite";
-$a->strings["Enable Tumblr Post Plugin"] = "Tumblr-Post-Plugin aktivieren";
+$a->strings["Enable Tumblr Post Addon"] = "Tumblr-Post-Addon aktivieren";
 $a->strings["Post to Tumblr by default"] = "Standardmäßig bei Tumblr veröffentlichen";
 $a->strings["Post to page:"] = "Auf tumblr veröffentlichen";
 $a->strings["You are not authenticated to tumblr"] = "Du bist gegenüber tumblr nicht authentifiziert";
index 375ea292f7b20368f2209dae204082ead7b248ef..12caadbf8832fdd3552721c408c5a0ebe285ce9e 100644 (file)
@@ -3,6 +3,6 @@
 $a->strings["Permission denied."] = "Malpermesita.";\r
 $a->strings["Post to Tumblr"] = "Afiŝi al Tumblr";\r
 $a->strings["Tumblr Post Settings"] = "Agordoj pri afiŝoj ĉe Tumblr";\r
-$a->strings["Enable Tumblr Post Plugin"] = "Ŝalti la kromprogramon por Tumblr afiŝoj";\r
+$a->strings["Enable Tumblr Post Addon"] = "Ŝalti la kromprogramon por Tumblr afiŝoj";\r
 $a->strings["Post to Tumblr by default"] = "Defaŭlte afiŝi ĉe Tumblr";\r
 $a->strings["Submit"] = "Sendi";\r
index 2f2eb43139a7caa0fdbf75c55118a1e12a1b7396..5993bd53850318a016fb930ad5601b64d1ca0c38 100644 (file)
@@ -44,8 +44,8 @@ msgid "(Re-)Authenticate your tumblr page"
 msgstr "(Re-)autenticar su página de tumblr"
 
 #: tumblr.php:192
-msgid "Enable Tumblr Post Plugin"
-msgstr "Habilite el plugin Tumblr Post"
+msgid "Enable Tumblr Post Addon"
+msgstr "Habilite el addon Tumblr Post"
 
 #: tumblr.php:197
 msgid "Post to Tumblr by default"
index 3a6e5ce99d2090a23ccbaac926cb6734d5a1c3ee..12d3d2d2a85f88772535d72341ef366d345d03d4 100644 (file)
@@ -11,7 +11,7 @@ $a->strings["return to the connector page"] = "Vuelva a la página del conector"
 $a->strings["Post to Tumblr"] = "Publicar en Tumblr";
 $a->strings["Tumblr Post Settings"] = "Ajustes de publicación de Tumblr";
 $a->strings["(Re-)Authenticate your tumblr page"] = "(Re-)autenticar su página de tumblr";
-$a->strings["Enable Tumblr Post Plugin"] = "Habilite el plugin Tumblr Post";
+$a->strings["Enable Tumblr Post Addon"] = "Habilite el addon Tumblr Post";
 $a->strings["Post to Tumblr by default"] = "Publique en Tumblr por defecto";
 $a->strings["Post to page:"] = "Publicar en página:";
 $a->strings["You are not authenticated to tumblr"] = "No está autenticado en tumblr";
index e23f85f72e11c9aed2757eb97df0ef47e4d77d70..c4d50431d34dd01e7726d4a42dca5373e399d5ba 100644 (file)
@@ -3,6 +3,6 @@
 $a->strings["Permission denied."] = "Permission refusée.";\r
 $a->strings["Post to Tumblr"] = "Publier sur Tumblr";\r
 $a->strings["Tumblr Post Settings"] = "Réglages de Tumblr";\r
-$a->strings["Enable Tumblr Post Plugin"] = "Activer l'extension Tumblr";\r
+$a->strings["Enable Tumblr Post Addon"] = "Activer l'extension Tumblr";\r
 $a->strings["Post to Tumblr by default"] = "Publier sur Tumblr par défaut";\r
 $a->strings["Submit"] = "Envoyer";\r
index cdd3d8362a7da2fa03b779190941d702a9e5f217..a477e8a6e6876dd7f371d19597ff1088e9f6d16c 100644 (file)
@@ -3,6 +3,6 @@
 $a->strings["Permission denied."] = "Heimild ekki veitt.";\r
 $a->strings["Post to Tumblr"] = "Senda fæslu til Tumblr";\r
 $a->strings["Tumblr Post Settings"] = "Tumblr færslu stillingar";\r
-$a->strings["Enable Tumblr Post Plugin"] = "Leyfa Tumblr færslu viðbót";\r
+$a->strings["Enable Tumblr Post Addon"] = "Leyfa Tumblr færslu viðbót";\r
 $a->strings["Post to Tumblr by default"] = "Senda færslu á Tumblr sjálfvirkt";\r
 $a->strings["Submit"] = "Senda inn";\r
index 11d5752afd14b811030dbc106ab1b7e56d9225ac..fbd176558b23d72eb4e0ea7c334e124d243f547c 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:28+0000\n"
+"PO-Revision-Date: 2018-03-19 13:25+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -44,8 +44,8 @@ msgid "(Re-)Authenticate your tumblr page"
 msgstr "(Ri)Autenticati con la tua pagina Tumblr"
 
 #: tumblr.php:192
-msgid "Enable Tumblr Post Plugin"
-msgstr "Abilita Plugin Tumblr"
+msgid "Enable Tumblr Post Addon"
+msgstr "Abilita componente aggiuntivo di invio a Tumblr"
 
 #: tumblr.php:197
 msgid "Post to Tumblr by default"
index 2c49b0f13e25df3ad56c9881f8dbde904e58222d..3cf0c95192507d46598698e812ce0cd345eb0d6a 100644 (file)
@@ -11,7 +11,7 @@ $a->strings["return to the connector page"] = "ritorna alla pagina del connettor
 $a->strings["Post to Tumblr"] = "Invia a Tumblr";
 $a->strings["Tumblr Post Settings"] = "Impostazioni di invio a Tumblr";
 $a->strings["(Re-)Authenticate your tumblr page"] = "(Ri)Autenticati con la tua pagina Tumblr";
-$a->strings["Enable Tumblr Post Plugin"] = "Abilita Plugin Tumblr";
+$a->strings["Enable Tumblr Post Addon"] = "Abilita componente aggiuntivo di invio a Tumblr";
 $a->strings["Post to Tumblr by default"] = "Invia sempre a Tumblr";
 $a->strings["Post to page:"] = "Invia alla pagina:";
 $a->strings["You are not authenticated to tumblr"] = "Non sei autenticato su Tumblr";
index 733128540039f6afe71a2080c54f7813682d5b1b..024c5517144d35b92ebcb61bfa66f3f87664d7ae 100644 (file)
@@ -3,6 +3,6 @@
 $a->strings["Permission denied."] = "Ingen tilgang.";\r
 $a->strings["Post to Tumblr"] = "";\r
 $a->strings["Tumblr Post Settings"] = "";\r
-$a->strings["Enable Tumblr Post Plugin"] = "";\r
+$a->strings["Enable Tumblr Post Addon"] = "";\r
 $a->strings["Post to Tumblr by default"] = "";\r
 $a->strings["Submit"] = "Lagre";\r
index 819c7c2053ba062aa4d37e434f56968a50b548e8..b01dddb65de7be3a09e583597ae210f87c4d37b3 100644 (file)
@@ -6,7 +6,7 @@ $a->strings["return to the connector page"] = "";
 $a->strings["Post to Tumblr"] = "Opublikuj na Tumblrze";\r
 $a->strings["Tumblr Post Settings"] = "Ustawienia postu Tumblr";\r
 $a->strings["(Re-)Authenticate your tumblr page"] = "";\r
-$a->strings["Enable Tumblr Post Plugin"] = "Zezwól na wtyczkę postu Tumblr";\r
+$a->strings["Enable Tumblr Post Addon"] = "Zezwól na wtyczkę postu Tumblr";\r
 $a->strings["Post to Tumblr by default"] = "Post do Tumblr przez standard";\r
 $a->strings["Post to page:"] = "Napisz na stronę:";\r
 $a->strings["You are not authenticated to tumblr"] = "";\r
index 6c80433ea5ddbd09ba4c920a6fe30e086ce4fd32..a0de33adf9f87ff3b168a5218b1054bd1670e88e 100644 (file)
@@ -44,7 +44,7 @@ msgid "(Re-)Authenticate your tumblr page"
 msgstr "(Re)autenticar sua página no Tumblr"
 
 #: tumblr.php:192
-msgid "Enable Tumblr Post Plugin"
+msgid "Enable Tumblr Post Addon"
 msgstr "Habilitar plug-in para publicar no Tumblr"
 
 #: tumblr.php:197
index e800cd710d443580478ee205343307a0d3e6ecd4..f77c85f204d7db0be8f89c9c8ce519f7f11d481c 100644 (file)
@@ -11,7 +11,7 @@ $a->strings["return to the connector page"] = "voltar à página de conectores";
 $a->strings["Post to Tumblr"] = "Publicar no Tumblr";
 $a->strings["Tumblr Post Settings"] = "Configurações de publicação no Tumblr";
 $a->strings["(Re-)Authenticate your tumblr page"] = "(Re)autenticar sua página no Tumblr";
-$a->strings["Enable Tumblr Post Plugin"] = "Habilitar plug-in para publicar no Tumblr";
+$a->strings["Enable Tumblr Post Addon"] = "Habilitar plug-in para publicar no Tumblr";
 $a->strings["Post to Tumblr by default"] = "Publicar no Tumblr por padrão";
 $a->strings["Post to page:"] = "Publicar na página:";
 $a->strings["You are not authenticated to tumblr"] = "Você não se autenticou no Tumblr";
index 46748edd9994a746d26fe9a208416afe5f1ccba5..4f3fba64a3669d46290ecd51105d58af0deb79d8 100644 (file)
@@ -43,7 +43,7 @@ msgid "(Re-)Authenticate your tumblr page"
 msgstr "(Re- )Autentificare pagină tumblr "
 
 #: tumblr.php:198
-msgid "Enable Tumblr Post Plugin"
+msgid "Enable Tumblr Post Addon"
 msgstr "Activare Modul Postare pe Tumblr "
 
 #: tumblr.php:203
index 7262ca4caa74b390641ed6f93078b49624898d1a..60f96432fc6b0db9b01597c2b2677ec39a4e968f 100644 (file)
@@ -11,7 +11,7 @@ $a->strings["return to the connector page"] = "revenire la pagina de conectare";
 $a->strings["Post to Tumblr"] = "Postați pe Tumblr";
 $a->strings["Tumblr Export"] = "Export Tumblr";
 $a->strings["(Re-)Authenticate your tumblr page"] = "(Re- )Autentificare pagină tumblr ";
-$a->strings["Enable Tumblr Post Plugin"] = "Activare Modul Postare pe Tumblr ";
+$a->strings["Enable Tumblr Post Addon"] = "Activare Modul Postare pe Tumblr ";
 $a->strings["Post to Tumblr by default"] = "Postați implicit pe Tumblr";
 $a->strings["Post to page:"] = "Postare pe pagina:";
 $a->strings["You are not authenticated to tumblr"] = "Nu sunteți autentificat pe tumblr.";
index 21d7724506bf0290d34d4cc95166bc3a0e898d68..cccb32c3ee4a5ef244995d1d70870301de58ab27 100644 (file)
@@ -3,6 +3,6 @@
 $a->strings["Permission denied."] = "Нет разрешения.";\r
 $a->strings["Post to Tumblr"] = "Написать в Tumblr";\r
 $a->strings["Tumblr Post Settings"] = "Tumblr Настройки сообщения";\r
-$a->strings["Enable Tumblr Post Plugin"] = "Включить Tumblr  плагин сообщений";\r
+$a->strings["Enable Tumblr Post Addon"] = "Включить Tumblr  плагин сообщений";\r
 $a->strings["Post to Tumblr by default"] = "Сообщение Tumblr по умолчанию";\r
 $a->strings["Submit"] = "Подтвердить";\r
index 0956e13ec51fd190de9bf8082fe267b541032b1a..da62cdba0c1445290b9b9fa57fb0973d6e4307d8 100644 (file)
@@ -6,7 +6,7 @@ $a->strings["return to the connector page"] = "会连接器页";
 $a->strings["Post to Tumblr"] = "发送到Tumblr";\r
 $a->strings["Tumblr Post Settings"] = "Tumblr发送设置";\r
 $a->strings["(Re-)Authenticate your tumblr page"] = "再认证您的tumblr页";\r
-$a->strings["Enable Tumblr Post Plugin"] = "使Tumblr发送插件能够";\r
+$a->strings["Enable Tumblr Post Addon"] = "使Tumblr发送插件能够";\r
 $a->strings["Post to Tumblr by default"] = "默认地给Tumblr发送";\r
 $a->strings["Post to page:"] = "放在页:";\r
 $a->strings["You are not authenticated to tumblr"] = "tumblr没证明您是真的";\r
diff --git a/tumblr/library/tumblroauth.php b/tumblr/library/tumblroauth.php
new file mode 100644 (file)
index 0000000..914e6af
--- /dev/null
@@ -0,0 +1,242 @@
+<?php
+
+/*
+ * Abraham Williams (abraham@abrah.am) http://abrah.am
+ *
+ * The first PHP Library to support OAuth for Tumblr's REST API.  (Originally for Twitter, modified for Tumblr by Lucas)
+ */
+
+/**
+ * Tumblr OAuth class
+ */
+class TumblrOAuth {
+  /* Contains the last HTTP status code returned. */
+  public $http_code;
+  /* Contains the last API call. */
+  public $url;
+  /* Set up the API root URL. */
+  public $host = "http://api.tumblr.com/v2/";
+  /* Set timeout default. */
+  public $timeout = 30;
+  /* Set connect timeout. */
+  public $connecttimeout = 30;
+  /* Verify SSL Cert. */
+  public $ssl_verifypeer = FALSE;
+  /* Respons format. */
+  public $format = 'json';
+  /* Decode returned json data. */
+  public $decode_json = TRUE;
+  /* Contains the last HTTP headers returned. */
+  public $http_info;
+  /* Set the useragnet. */
+  public $useragent = 'TumblrOAuth v0.2.0-beta2';
+  /* Immediately retry the API call if the response was not successful. */
+  //public $retry = TRUE;
+
+
+
+
+  /**
+   * Set API URLS
+   */
+  function accessTokenURL()  { return 'http://www.tumblr.com/oauth/access_token'; }
+  function authenticateURL() { return 'http://www.tumblr.com/oauth/authorize'; }
+  function authorizeURL()    { return 'http://www.tumblr.com/oauth/authorize'; }
+  function requestTokenURL() { return 'http://www.tumblr.com/oauth/request_token'; }
+
+  /**
+   * Debug helpers
+   */
+  function lastStatusCode() { return $this->http_status; }
+  function lastAPICall() { return $this->last_api_call; }
+
+  /**
+   * construct TumblrOAuth object
+   */
+  function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) {
+    $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1();
+    $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret);
+    if (!empty($oauth_token) && !empty($oauth_token_secret)) {
+      $this->token = new OAuthConsumer($oauth_token, $oauth_token_secret);
+    } else {
+      $this->token = NULL;
+    }
+  }
+
+
+  /**
+   * Get a request_token from Tumblr
+   *
+   * @returns a key/value array containing oauth_token and oauth_token_secret
+   */
+  function getRequestToken($oauth_callback = NULL) {
+    $parameters = array();
+    if (!empty($oauth_callback)) {
+      $parameters['oauth_callback'] = $oauth_callback;
+    }
+    $request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters);
+    $token = OAuthUtil::parse_parameters($request);
+    $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
+    return $token;
+  }
+
+  /**
+   * Get the authorize URL
+   *
+   * @returns a string
+   */
+  function getAuthorizeURL($token, $sign_in_with_tumblr = TRUE) {
+    if (is_array($token)) {
+      $token = $token['oauth_token'];
+    }
+    if (empty($sign_in_with_tumblr)) {
+      return $this->authorizeURL() . "?oauth_token={$token}";
+    } else {
+       return $this->authenticateURL() . "?oauth_token={$token}";
+    }
+  }
+
+  /**
+   * Exchange request token and secret for an access token and
+   * secret, to sign API calls.
+   *
+   * @returns array("oauth_token" => "the-access-token",
+   *                "oauth_token_secret" => "the-access-secret",
+   *                "user_id" => "9436992",
+   *                "screen_name" => "abraham")
+   */
+  function getAccessToken($oauth_verifier = FALSE) {
+    $parameters = array();
+    if (!empty($oauth_verifier)) {
+      $parameters['oauth_verifier'] = $oauth_verifier;
+    }
+    $request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters);
+    $token = OAuthUtil::parse_parameters($request);
+    $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
+    return $token;
+  }
+
+  /**
+   * One time exchange of username and password for access token and secret.
+   *
+   * @returns array("oauth_token" => "the-access-token",
+   *                "oauth_token_secret" => "the-access-secret",
+   *                "user_id" => "9436992",
+   *                "screen_name" => "abraham",
+   *                "x_auth_expires" => "0")
+   */
+  function getXAuthToken($username, $password) {
+    $parameters = array();
+    $parameters['x_auth_username'] = $username;
+    $parameters['x_auth_password'] = $password;
+    $parameters['x_auth_mode'] = 'client_auth';
+    $request = $this->oAuthRequest($this->accessTokenURL(), 'POST', $parameters);
+    $token = OAuthUtil::parse_parameters($request);
+    $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
+    return $token;
+  }
+
+  /**
+   * GET wrapper for oAuthRequest.
+   */
+  function get($url, $parameters = array()) {
+    $response = $this->oAuthRequest($url, 'GET', $parameters);
+    if ($this->format === 'json' && $this->decode_json) {
+      return json_decode($response);
+    }
+    return $response;
+  }
+
+  /**
+   * POST wrapper for oAuthRequest.
+   */
+  function post($url, $parameters = array()) {
+    $response = $this->oAuthRequest($url, 'POST', $parameters);
+    if ($this->format === 'json' && $this->decode_json) {
+      return json_decode($response);
+    }
+    return $response;
+  }
+
+  /**
+   * DELETE wrapper for oAuthReqeust.
+   */
+  function delete($url, $parameters = array()) {
+    $response = $this->oAuthRequest($url, 'DELETE', $parameters);
+    if ($this->format === 'json' && $this->decode_json) {
+      return json_decode($response);
+    }
+    return $response;
+  }
+
+  /**
+   * Format and sign an OAuth / API request
+   */
+  function oAuthRequest($url, $method, $parameters) {
+    if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0) {
+      $url = "{$this->host}{$url}";
+    }
+    $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);
+    $request->sign_request($this->sha1_method, $this->consumer, $this->token);
+    switch ($method) {
+    case 'GET':
+      return $this->http($request->to_url(), 'GET');
+    default:
+      return $this->http($request->get_normalized_http_url(), $method, $request->to_postdata());
+    }
+  }
+
+  /**
+   * Make an HTTP request
+   *
+   * @return API results
+   */
+  function http($url, $method, $postfields = NULL) {
+    $this->http_info = array();
+    $ci = curl_init();
+    /* Curl settings */
+    curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
+    curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
+    curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
+    curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
+    curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
+    curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
+    curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
+    curl_setopt($ci, CURLOPT_HEADER, FALSE);
+
+    switch ($method) {
+      case 'POST':
+        curl_setopt($ci, CURLOPT_POST, TRUE);
+        if (!empty($postfields)) {
+          curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
+        }
+        break;
+      case 'DELETE':
+        curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
+        if (!empty($postfields)) {
+          $url = "{$url}?{$postfields}";
+        }
+    }
+
+    curl_setopt($ci, CURLOPT_URL, $url);
+    $response = curl_exec($ci);
+    $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
+    $this->http_info = array_merge($this->http_info, curl_getinfo($ci));
+    $this->url = $url;
+    curl_close ($ci);
+    return $response;
+  }
+
+  /**
+   * Get the header info to store.
+   */
+  function getHeader($ch, $header) {
+    $i = strpos($header, ':');
+    if (!empty($i)) {
+      $key = str_replace('-', '_', strtolower(substr($header, 0, $i)));
+      $value = trim(substr($header, $i + 2));
+      $this->http_header[$key] = $value;
+    }
+    return strlen($header);
+  }
+}
index 50530401d223df7fd8091d755e77ba8e8ed7b826..e038b843a80cda4a282368291b79d1dfb112f510 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Name: Tumblr Post Connector
  * Description: Post to Tumblr
@@ -8,23 +7,28 @@
  * Author: Michael Vogel <https://pirati.ca/profile/heluecht>
  */
 
-require_once('library/OAuth1.php');
-require_once('addon/tumblr/tumblroauth/tumblroauth.php');
+require_once __DIR__ . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'tumblroauth.php';
+
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
 
 function tumblr_install() {
-       register_hook('post_local',           'addon/tumblr/tumblr.php', 'tumblr_post_local');
-       register_hook('notifier_normal',      'addon/tumblr/tumblr.php', 'tumblr_send');
-       register_hook('jot_networks',         'addon/tumblr/tumblr.php', 'tumblr_jot_nets');
-       register_hook('connector_settings',      'addon/tumblr/tumblr.php', 'tumblr_settings');
-       register_hook('connector_settings_post', 'addon/tumblr/tumblr.php', 'tumblr_settings_post');
+       Addon::registerHook('post_local',           'addon/tumblr/tumblr.php', 'tumblr_post_local');
+       Addon::registerHook('notifier_normal',      'addon/tumblr/tumblr.php', 'tumblr_send');
+       Addon::registerHook('jot_networks',         'addon/tumblr/tumblr.php', 'tumblr_jot_nets');
+       Addon::registerHook('connector_settings',      'addon/tumblr/tumblr.php', 'tumblr_settings');
+       Addon::registerHook('connector_settings_post', 'addon/tumblr/tumblr.php', 'tumblr_settings_post');
 
 }
 function tumblr_uninstall() {
-       unregister_hook('post_local',       'addon/tumblr/tumblr.php', 'tumblr_post_local');
-       unregister_hook('notifier_normal',  'addon/tumblr/tumblr.php', 'tumblr_send');
-       unregister_hook('jot_networks',     'addon/tumblr/tumblr.php', 'tumblr_jot_nets');
-       unregister_hook('connector_settings',      'addon/tumblr/tumblr.php', 'tumblr_settings');
-       unregister_hook('connector_settings_post', 'addon/tumblr/tumblr.php', 'tumblr_settings_post');
+       Addon::unregisterHook('post_local',       'addon/tumblr/tumblr.php', 'tumblr_post_local');
+       Addon::unregisterHook('notifier_normal',  'addon/tumblr/tumblr.php', 'tumblr_send');
+       Addon::unregisterHook('jot_networks',     'addon/tumblr/tumblr.php', 'tumblr_jot_nets');
+       Addon::unregisterHook('connector_settings',      'addon/tumblr/tumblr.php', 'tumblr_settings');
+       Addon::unregisterHook('connector_settings_post', 'addon/tumblr/tumblr.php', 'tumblr_settings_post');
 }
 
 function tumblr_module() {}
@@ -32,7 +36,7 @@ function tumblr_module() {}
 function tumblr_content(&$a) {
 
        if(! local_user()) {
-               notice( t('Permission denied.') . EOL);
+               notice(L10n::t('Permission denied.') . EOL);
                return '';
        }
 
@@ -54,23 +58,23 @@ function tumblr_content(&$a) {
        return $o;
 }
 
-function tumblr_plugin_admin(&$a, &$o){
+function tumblr_addon_admin(&$a, &$o){
         $t = get_markup_template( "admin.tpl", "addon/tumblr/" );
 
-        $o = replace_macros($t, array(
-                '$submit' => t('Save Settings'),
+        $o = replace_macros($t, [
+                '$submit' => L10n::t('Save Settings'),
                                                                 // name, label, value, help, [extra values]
-                '$consumer_key' => array('consumer_key', t('Consumer Key'),  get_config('tumblr', 'consumer_key' ), ''),
-                '$consumer_secret' => array('consumer_secret', t('Consumer Secret'),  get_config('tumblr', 'consumer_secret' ), ''),
-        ));
+                '$consumer_key' => ['consumer_key', L10n::t('Consumer Key'),  Config::get('tumblr', 'consumer_key' ), ''],
+                '$consumer_secret' => ['consumer_secret', L10n::t('Consumer Secret'),  Config::get('tumblr', 'consumer_secret' ), ''],
+        ]);
 }
 
-function tumblr_plugin_admin_post(&$a){
+function tumblr_addon_admin_post(&$a){
         $consumer_key     =       ((x($_POST,'consumer_key'))              ? notags(trim($_POST['consumer_key']))   : '');
         $consumer_secret =       ((x($_POST,'consumer_secret'))   ? notags(trim($_POST['consumer_secret'])): '');
-        set_config('tumblr','consumer_key',$consumer_key);
-        set_config('tumblr','consumer_secret',$consumer_secret);
-        info( t('Settings updated.'). EOL );
+        Config::set('tumblr','consumer_key',$consumer_key);
+        Config::set('tumblr','consumer_secret',$consumer_secret);
+        info(L10n::t('Settings updated.'). EOL);
 }
 
 function tumblr_connect($a) {
@@ -161,8 +165,8 @@ function tumblr_callback($a) {
        set_pconfig(local_user(), "tumblr", "oauth_token", $access_token['oauth_token']);
        set_pconfig(local_user(), "tumblr", "oauth_token_secret", $access_token['oauth_token_secret']);
 
-       $o = t("You are now authenticated to tumblr.");
-       $o .= '<br /><a href="'.$a->get_baseurl().'/settings/connectors">'.t("return to the connector page").'</a>';
+       $o = L10n::t("You are now authenticated to tumblr.");
+       $o .= '<br /><a href="'.$a->get_baseurl().'/settings/connectors">'.L10n::t("return to the connector page").'</a>';
        return($o);
 }
 
@@ -175,7 +179,7 @@ function tumblr_jot_nets(&$a,&$b) {
                $tmbl_defpost = get_pconfig(local_user(),'tumblr','post_by_default');
                $selected = ((intval($tmbl_defpost) == 1) ? ' checked="checked" ' : '');
                $b .= '<div class="profile-jot-net"><input type="checkbox" name="tumblr_enable"' . $selected . ' value="1" /> '
-                       . t('Post to Tumblr') . '</div>';
+                       . L10n::t('Post to Tumblr') . '</div>';
        }
 }
 
@@ -202,24 +206,24 @@ function tumblr_settings(&$a,&$s) {
        /* Add some HTML to the existing form */
 
        $s .= '<span id="settings_tumblr_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_tumblr_expanded\'); openClose(\'settings_tumblr_inflated\');">';
-       $s .= '<img class="connector'.$css.'" src="images/tumblr.png" /><h3 class="connector">'. t('Tumblr Export').'</h3>';
+       $s .= '<img class="connector'.$css.'" src="images/tumblr.png" /><h3 class="connector">'. L10n::t('Tumblr Export').'</h3>';
        $s .= '</span>';
        $s .= '<div id="settings_tumblr_expanded" class="settings-block" style="display: none;">';
        $s .= '<span class="fakelink" onclick="openClose(\'settings_tumblr_expanded\'); openClose(\'settings_tumblr_inflated\');">';
-       $s .= '<img class="connector'.$css.'" src="images/tumblr.png" /><h3 class="connector">'. t('Tumblr Export').'</h3>';
+       $s .= '<img class="connector'.$css.'" src="images/tumblr.png" /><h3 class="connector">'. L10n::t('Tumblr Export').'</h3>';
        $s .= '</span>';
 
        $s .= '<div id="tumblr-username-wrapper">';
-       $s .= '<a href="'.$a->get_baseurl().'/tumblr/connect">'.t("(Re-)Authenticate your tumblr page").'</a>';
+       $s .= '<a href="'.$a->get_baseurl().'/tumblr/connect">'.L10n::t("(Re-)Authenticate your tumblr page").'</a>';
        $s .= '</div><div class="clear"></div>';
 
        $s .= '<div id="tumblr-enable-wrapper">';
-       $s .= '<label id="tumblr-enable-label" for="tumblr-checkbox">' . t('Enable Tumblr Post Plugin') . '</label>';
+       $s .= '<label id="tumblr-enable-label" for="tumblr-checkbox">' . L10n::t('Enable Tumblr Post Addon') . '</label>';
        $s .= '<input id="tumblr-checkbox" type="checkbox" name="tumblr" value="1" ' . $checked . '/>';
        $s .= '</div><div class="clear"></div>';
 
        $s .= '<div id="tumblr-bydefault-wrapper">';
-       $s .= '<label id="tumblr-bydefault-label" for="tumblr-bydefault">' . t('Post to Tumblr by default') . '</label>';
+       $s .= '<label id="tumblr-bydefault-label" for="tumblr-bydefault">' . L10n::t('Post to Tumblr by default') . '</label>';
        $s .= '<input id="tumblr-bydefault" type="checkbox" name="tumblr_bydefault" value="1" ' . $def_checked . '/>';
        $s .= '</div><div class="clear"></div>';
 
@@ -239,7 +243,7 @@ function tumblr_settings(&$a,&$s) {
 
                $blogs = array();
 
-               $s .= '<label id="tumblr-page-label" for="tumblr-page">' . t('Post to page:') . '</label>';
+               $s .= '<label id="tumblr-page-label" for="tumblr-page">' . L10n::t('Post to page:') . '</label>';
                $s .= '<select name="tumblr_page" id="tumblr-page">';
                foreach($userinfo->response->user->blogs as $blog) {
                        $blogurl = substr(str_replace(array("http://", "https://"), array("", ""), $blog->url), 0, -1);
@@ -251,12 +255,12 @@ function tumblr_settings(&$a,&$s) {
 
                $s .= "</select>";
        } else
-               $s .= t("You are not authenticated to tumblr");
+               $s .= L10n::t("You are not authenticated to tumblr");
        $s .= '</div><div class="clear"></div>';
 
        /* provide a submit button */
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="tumblr-submit" name="tumblr-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="tumblr-submit" name="tumblr-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
 }
 
@@ -328,10 +332,7 @@ function tumblr_send(&$a,&$b) {
        $tmbl_blog = 'blog/'.$page.'/post';
 
        if($oauth_token && $oauth_token_secret && $tmbl_blog) {
-
-               require_once('include/bbcode.php');
-
-               $tag_arr = array();
+               $tag_arr = [];
                $tags = '';
                $x = preg_match_all('/\#\[(.*?)\](.*?)\[/',$b['tag'],$matches,PREG_SET_ORDER);
 
@@ -344,9 +345,8 @@ function tumblr_send(&$a,&$b) {
                        $tags = implode(',',$tag_arr);
 
                $title = trim($b['title']);
-               require_once('include/plaintext.php');
 
-               $siteinfo = get_attached_data($b["body"]);
+               $siteinfo = BBCode::getAttachedData($b["body"]);
 
                $params = array(
                        'state' => 'published',
@@ -363,12 +363,12 @@ function tumblr_send(&$a,&$b) {
                if (isset($siteinfo["text"]))
                        $body = $siteinfo["text"];
                else
-                       $body = bb_remove_share_information($b["body"]);
+                       $body = BBCode::removeShareInformation($b["body"]);
 
                switch ($siteinfo["type"]) {
                        case "photo":
                                $params['type'] = "photo";
-                               $params['caption'] = bbcode($body, false, false, 4);
+                               $params['caption'] = BBCode::convert($body, false, 4);
 
                                if (isset($siteinfo["url"]))
                                        $params['link'] = $siteinfo["url"];
@@ -379,22 +379,22 @@ function tumblr_send(&$a,&$b) {
                                $params['type'] = "link";
                                $params['title'] = $title;
                                $params['url'] = $siteinfo["url"];
-                               $params['description'] = bbcode($body, false, false, 4);
+                               $params['description'] = BBCode::convert($body, false, 4);
                                break;
                        case "audio":
                                $params['type'] = "audio";
                                $params['external_url'] = $siteinfo["url"];
-                               $params['caption'] = bbcode($body, false, false, 4);
+                               $params['caption'] = BBCode::convert($body, false, 4);
                                break;
                        case "video":
                                $params['type'] = "video";
                                $params['embed'] = $siteinfo["url"];
-                               $params['caption'] = bbcode($body, false, false, 4);
+                               $params['caption'] = BBCode::convert($body, false, 4);
                                break;
                        default:
                                $params['type'] = "text";
                                $params['title'] = $title;
-                               $params['body'] = bbcode($b['body'], false, false, 4);
+                               $params['body'] = BBCode::convert($b['body'], false, 4);
                                break;
                }
 
@@ -403,7 +403,7 @@ function tumblr_send(&$a,&$b) {
                                                "<p>".$params['caption']."</p>";
 
                if (trim($params['caption']) == "")
-                       $params['caption'] = bbcode("[quote]".$siteinfo["description"]."[/quote]", false, false, 4);
+                       $params['caption'] = BBCode::convert("[quote]" . $siteinfo["description"] . "[/quote]", false, 4);
 
                $consumer_key = get_config('tumblr','consumer_key');
                $consumer_secret = get_config('tumblr','consumer_secret');
diff --git a/tumblr/tumblroauth/OAuth.php b/tumblr/tumblroauth/OAuth.php
deleted file mode 100644 (file)
index 982aaa5..0000000
+++ /dev/null
@@ -1,874 +0,0 @@
-<?php\r
-// vim: foldmethod=marker\r
-\r
-/* Generic exception class\r
- */\r
-class OAuthException extends Exception {\r
-  // pass\r
-}\r
-\r
-class OAuthConsumer {\r
-  public $key;\r
-  public $secret;\r
-\r
-  function __construct($key, $secret, $callback_url=NULL) {\r
-    $this->key = $key;\r
-    $this->secret = $secret;\r
-    $this->callback_url = $callback_url;\r
-  }\r
-\r
-  function __toString() {\r
-    return "OAuthConsumer[key=$this->key,secret=$this->secret]";\r
-  }\r
-}\r
-\r
-class OAuthToken {\r
-  // access tokens and request tokens\r
-  public $key;\r
-  public $secret;\r
-\r
-  /**\r
-   * key = the token\r
-   * secret = the token secret\r
-   */\r
-  function __construct($key, $secret) {\r
-    $this->key = $key;\r
-    $this->secret = $secret;\r
-  }\r
-\r
-  /**\r
-   * generates the basic string serialization of a token that a server\r
-   * would respond to request_token and access_token calls with\r
-   */\r
-  function to_string() {\r
-    return "oauth_token=" .\r
-           OAuthUtil::urlencode_rfc3986($this->key) .\r
-           "&oauth_token_secret=" .\r
-           OAuthUtil::urlencode_rfc3986($this->secret);\r
-  }\r
-\r
-  function __toString() {\r
-    return $this->to_string();\r
-  }\r
-}\r
-\r
-/**\r
- * A class for implementing a Signature Method\r
- * See section 9 ("Signing Requests") in the spec\r
- */\r
-abstract class OAuthSignatureMethod {\r
-  /**\r
-   * Needs to return the name of the Signature Method (ie HMAC-SHA1)\r
-   * @return string\r
-   */\r
-  abstract public function get_name();\r
-\r
-  /**\r
-   * Build up the signature\r
-   * NOTE: The output of this function MUST NOT be urlencoded.\r
-   * the encoding is handled in OAuthRequest when the final\r
-   * request is serialized\r
-   * @param OAuthRequest $request\r
-   * @param OAuthConsumer $consumer\r
-   * @param OAuthToken $token\r
-   * @return string\r
-   */\r
-  abstract public function build_signature($request, $consumer, $token);\r
-\r
-  /**\r
-   * Verifies that a given signature is correct\r
-   * @param OAuthRequest $request\r
-   * @param OAuthConsumer $consumer\r
-   * @param OAuthToken $token\r
-   * @param string $signature\r
-   * @return bool\r
-   */\r
-  public function check_signature($request, $consumer, $token, $signature) {\r
-    $built = $this->build_signature($request, $consumer, $token);\r
-    return $built == $signature;\r
-  }\r
-}\r
-\r
-/**\r
- * The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as defined in [RFC2104] \r
- * where the Signature Base String is the text and the key is the concatenated values (each first \r
- * encoded per Parameter Encoding) of the Consumer Secret and Token Secret, separated by an '&' \r
- * character (ASCII code 38) even if empty.\r
- *   - Chapter 9.2 ("HMAC-SHA1")\r
- */\r
-class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod {\r
-  function get_name() {\r
-    return "HMAC-SHA1";\r
-  }\r
-\r
-  public function build_signature($request, $consumer, $token) {\r
-    $base_string = $request->get_signature_base_string();\r
-    $request->base_string = $base_string;\r
-\r
-    $key_parts = array(\r
-      $consumer->secret,\r
-      ($token) ? $token->secret : ""\r
-    );\r
-\r
-    $key_parts = OAuthUtil::urlencode_rfc3986($key_parts);\r
-    $key = implode('&', $key_parts);\r
-\r
-    return base64_encode(hash_hmac('sha1', $base_string, $key, true));\r
-  }\r
-}\r
-\r
-/**\r
- * The PLAINTEXT method does not provide any security protection and SHOULD only be used \r
- * over a secure channel such as HTTPS. It does not use the Signature Base String.\r
- *   - Chapter 9.4 ("PLAINTEXT")\r
- */\r
-class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod {\r
-  public function get_name() {\r
-    return "PLAINTEXT";\r
-  }\r
-\r
-  /**\r
-   * oauth_signature is set to the concatenated encoded values of the Consumer Secret and \r
-   * Token Secret, separated by a '&' character (ASCII code 38), even if either secret is \r
-   * empty. The result MUST be encoded again.\r
-   *   - Chapter 9.4.1 ("Generating Signatures")\r
-   *\r
-   * Please note that the second encoding MUST NOT happen in the SignatureMethod, as\r
-   * OAuthRequest handles this!\r
-   */\r
-  public function build_signature($request, $consumer, $token) {\r
-    $key_parts = array(\r
-      $consumer->secret,\r
-      ($token) ? $token->secret : ""\r
-    );\r
-\r
-    $key_parts = OAuthUtil::urlencode_rfc3986($key_parts);\r
-    $key = implode('&', $key_parts);\r
-    $request->base_string = $key;\r
-\r
-    return $key;\r
-  }\r
-}\r
-\r
-/**\r
- * The RSA-SHA1 signature method uses the RSASSA-PKCS1-v1_5 signature algorithm as defined in \r
- * [RFC3447] section 8.2 (more simply known as PKCS#1), using SHA-1 as the hash function for \r
- * EMSA-PKCS1-v1_5. It is assumed that the Consumer has provided its RSA public key in a \r
- * verified way to the Service Provider, in a manner which is beyond the scope of this \r
- * specification.\r
- *   - Chapter 9.3 ("RSA-SHA1")\r
- */\r
-abstract class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod {\r
-  public function get_name() {\r
-    return "RSA-SHA1";\r
-  }\r
-\r
-  // Up to the SP to implement this lookup of keys. Possible ideas are:\r
-  // (1) do a lookup in a table of trusted certs keyed off of consumer\r
-  // (2) fetch via http using a url provided by the requester\r
-  // (3) some sort of specific discovery code based on request\r
-  //\r
-  // Either way should return a string representation of the certificate\r
-  protected abstract function fetch_public_cert(&$request);\r
-\r
-  // Up to the SP to implement this lookup of keys. Possible ideas are:\r
-  // (1) do a lookup in a table of trusted certs keyed off of consumer\r
-  //\r
-  // Either way should return a string representation of the certificate\r
-  protected abstract function fetch_private_cert(&$request);\r
-\r
-  public function build_signature($request, $consumer, $token) {\r
-    $base_string = $request->get_signature_base_string();\r
-    $request->base_string = $base_string;\r
-\r
-    // Fetch the private key cert based on the request\r
-    $cert = $this->fetch_private_cert($request);\r
-\r
-    // Pull the private key ID from the certificate\r
-    $privatekeyid = openssl_get_privatekey($cert);\r
-\r
-    // Sign using the key\r
-    $ok = openssl_sign($base_string, $signature, $privatekeyid);\r
-\r
-    // Release the key resource\r
-    openssl_free_key($privatekeyid);\r
-\r
-    return base64_encode($signature);\r
-  }\r
-\r
-  public function check_signature($request, $consumer, $token, $signature) {\r
-    $decoded_sig = base64_decode($signature);\r
-\r
-    $base_string = $request->get_signature_base_string();\r
-\r
-    // Fetch the public key cert based on the request\r
-    $cert = $this->fetch_public_cert($request);\r
-\r
-    // Pull the public key ID from the certificate\r
-    $publickeyid = openssl_get_publickey($cert);\r
-\r
-    // Check the computed signature against the one passed in the query\r
-    $ok = openssl_verify($base_string, $decoded_sig, $publickeyid);\r
-\r
-    // Release the key resource\r
-    openssl_free_key($publickeyid);\r
-\r
-    return $ok == 1;\r
-  }\r
-}\r
-\r
-class OAuthRequest {\r
-  private $parameters;\r
-  private $http_method;\r
-  private $http_url;\r
-  // for debug purposes\r
-  public $base_string;\r
-  public static $version = '1.0';\r
-  public static $POST_INPUT = 'php://input';\r
-\r
-  function __construct($http_method, $http_url, $parameters=NULL) {\r
-    @$parameters or $parameters = array();\r
-    $parameters = array_merge( OAuthUtil::parse_parameters(parse_url($http_url, PHP_URL_QUERY)), $parameters);\r
-    $this->parameters = $parameters;\r
-    $this->http_method = $http_method;\r
-    $this->http_url = $http_url;\r
-  }\r
-\r
-\r
-  /**\r
-   * attempt to build up a request from what was passed to the server\r
-   */\r
-  public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) {\r
-    $scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on")\r
-              ? 'http'\r
-              : 'https';\r
-    @$http_url or $http_url = $scheme .\r
-                              '://' . $_SERVER['HTTP_HOST'] .\r
-                              ':' .\r
-                              $_SERVER['SERVER_PORT'] .\r
-                              $_SERVER['REQUEST_URI'];\r
-    @$http_method or $http_method = $_SERVER['REQUEST_METHOD'];\r
-\r
-    // We weren't handed any parameters, so let's find the ones relevant to\r
-    // this request.\r
-    // If you run XML-RPC or similar you should use this to provide your own\r
-    // parsed parameter-list\r
-    if (!$parameters) {\r
-      // Find request headers\r
-      $request_headers = OAuthUtil::get_headers();\r
-\r
-      // Parse the query-string to find GET parameters\r
-      $parameters = OAuthUtil::parse_parameters($_SERVER['QUERY_STRING']);\r
-\r
-      // It's a POST request of the proper content-type, so parse POST\r
-      // parameters and add those overriding any duplicates from GET\r
-      if ($http_method == "POST"\r
-          && @strstr($request_headers["Content-Type"],\r
-                     "application/x-www-form-urlencoded")\r
-          ) {\r
-        $post_data = OAuthUtil::parse_parameters(\r
-          file_get_contents(self::$POST_INPUT)\r
-        );\r
-        $parameters = array_merge($parameters, $post_data);\r
-      }\r
-\r
-      // We have a Authorization-header with OAuth data. Parse the header\r
-      // and add those overriding any duplicates from GET or POST\r
-      if (@substr($request_headers['Authorization'], 0, 6) == "OAuth ") {\r
-        $header_parameters = OAuthUtil::split_header(\r
-          $request_headers['Authorization']\r
-        );\r
-        $parameters = array_merge($parameters, $header_parameters);\r
-      }\r
-\r
-    }\r
-\r
-    return new OAuthRequest($http_method, $http_url, $parameters);\r
-  }\r
-\r
-  /**\r
-   * pretty much a helper function to set up the request\r
-   */\r
-  public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) {\r
-    @$parameters or $parameters = array();\r
-    $defaults = array("oauth_version" => OAuthRequest::$version,\r
-                      "oauth_nonce" => OAuthRequest::generate_nonce(),\r
-                      "oauth_timestamp" => OAuthRequest::generate_timestamp(),\r
-                      "oauth_consumer_key" => $consumer->key);\r
-    if ($token)\r
-      $defaults['oauth_token'] = $token->key;\r
-\r
-    $parameters = array_merge($defaults, $parameters);\r
-\r
-    return new OAuthRequest($http_method, $http_url, $parameters);\r
-  }\r
-\r
-  public function set_parameter($name, $value, $allow_duplicates = true) {\r
-    if ($allow_duplicates && isset($this->parameters[$name])) {\r
-      // We have already added parameter(s) with this name, so add to the list\r
-      if (is_scalar($this->parameters[$name])) {\r
-        // This is the first duplicate, so transform scalar (string)\r
-        // into an array so we can add the duplicates\r
-        $this->parameters[$name] = array($this->parameters[$name]);\r
-      }\r
-\r
-      $this->parameters[$name][] = $value;\r
-    } else {\r
-      $this->parameters[$name] = $value;\r
-    }\r
-  }\r
-\r
-  public function get_parameter($name) {\r
-    return isset($this->parameters[$name]) ? $this->parameters[$name] : null;\r
-  }\r
-\r
-  public function get_parameters() {\r
-    return $this->parameters;\r
-  }\r
-\r
-  public function unset_parameter($name) {\r
-    unset($this->parameters[$name]);\r
-  }\r
-\r
-  /**\r
-   * The request parameters, sorted and concatenated into a normalized string.\r
-   * @return string\r
-   */\r
-  public function get_signable_parameters() {\r
-    // Grab all parameters\r
-    $params = $this->parameters;\r
-\r
-    // Remove oauth_signature if present\r
-    // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.")\r
-    if (isset($params['oauth_signature'])) {\r
-      unset($params['oauth_signature']);\r
-    }\r
-\r
-    return OAuthUtil::build_http_query($params);\r
-  }\r
-\r
-  /**\r
-   * Returns the base string of this request\r
-   *\r
-   * The base string defined as the method, the url\r
-   * and the parameters (normalized), each urlencoded\r
-   * and the concated with &.\r
-   */\r
-  public function get_signature_base_string() {\r
-    $parts = array(\r
-      $this->get_normalized_http_method(),\r
-      $this->get_normalized_http_url(),\r
-      $this->get_signable_parameters()\r
-    );\r
-\r
-    $parts = OAuthUtil::urlencode_rfc3986($parts);\r
-\r
-    return implode('&', $parts);\r
-  }\r
-\r
-  /**\r
-   * just uppercases the http method\r
-   */\r
-  public function get_normalized_http_method() {\r
-    return strtoupper($this->http_method);\r
-  }\r
-\r
-  /**\r
-   * parses the url and rebuilds it to be\r
-   * scheme://host/path\r
-   */\r
-  public function get_normalized_http_url() {\r
-    $parts = parse_url($this->http_url);\r
-\r
-    $port = @$parts['port'];\r
-    $scheme = $parts['scheme'];\r
-    $host = $parts['host'];\r
-    $path = @$parts['path'];\r
-\r
-    $port or $port = ($scheme == 'https') ? '443' : '80';\r
-\r
-    if (($scheme == 'https' && $port != '443')\r
-        || ($scheme == 'http' && $port != '80')) {\r
-      $host = "$host:$port";\r
-    }\r
-    return "$scheme://$host$path";\r
-  }\r
-\r
-  /**\r
-   * builds a url usable for a GET request\r
-   */\r
-  public function to_url() {\r
-    $post_data = $this->to_postdata();\r
-    $out = $this->get_normalized_http_url();\r
-    if ($post_data) {\r
-      $out .= '?'.$post_data;\r
-    }\r
-    return $out;\r
-  }\r
-\r
-  /**\r
-   * builds the data one would send in a POST request\r
-   */\r
-  public function to_postdata() {\r
-    return OAuthUtil::build_http_query($this->parameters);\r
-  }\r
-\r
-  /**\r
-   * builds the Authorization: header\r
-   */\r
-  public function to_header($realm=null) {\r
-    $first = true;\r
-       if($realm) {\r
-      $out = 'Authorization: OAuth realm="' . OAuthUtil::urlencode_rfc3986($realm) . '"';\r
-      $first = false;\r
-    } else\r
-      $out = 'Authorization: OAuth';\r
-\r
-    $total = array();\r
-    foreach ($this->parameters as $k => $v) {\r
-      if (substr($k, 0, 5) != "oauth") continue;\r
-      if (is_array($v)) {\r
-        throw new OAuthException('Arrays not supported in headers');\r
-      }\r
-      $out .= ($first) ? ' ' : ',';\r
-      $out .= OAuthUtil::urlencode_rfc3986($k) .\r
-              '="' .\r
-              OAuthUtil::urlencode_rfc3986($v) .\r
-              '"';\r
-      $first = false;\r
-    }\r
-    return $out;\r
-  }\r
-\r
-  public function __toString() {\r
-    return $this->to_url();\r
-  }\r
-\r
-\r
-  public function sign_request($signature_method, $consumer, $token) {\r
-    $this->set_parameter(\r
-      "oauth_signature_method",\r
-      $signature_method->get_name(),\r
-      false\r
-    );\r
-    $signature = $this->build_signature($signature_method, $consumer, $token);\r
-    $this->set_parameter("oauth_signature", $signature, false);\r
-  }\r
-\r
-  public function build_signature($signature_method, $consumer, $token) {\r
-    $signature = $signature_method->build_signature($this, $consumer, $token);\r
-    return $signature;\r
-  }\r
-\r
-  /**\r
-   * util function: current timestamp\r
-   */\r
-  private static function generate_timestamp() {\r
-    return time();\r
-  }\r
-\r
-  /**\r
-   * util function: current nonce\r
-   */\r
-  private static function generate_nonce() {\r
-    $mt = microtime();\r
-    $rand = mt_rand();\r
-\r
-    return md5($mt . $rand); // md5s look nicer than numbers\r
-  }\r
-}\r
-\r
-class OAuthServer {\r
-  protected $timestamp_threshold = 300; // in seconds, five minutes\r
-  protected $version = '1.0';             // hi blaine\r
-  protected $signature_methods = array();\r
-\r
-  protected $data_store;\r
-\r
-  function __construct($data_store) {\r
-    $this->data_store = $data_store;\r
-  }\r
-\r
-  public function add_signature_method($signature_method) {\r
-    $this->signature_methods[$signature_method->get_name()] =\r
-      $signature_method;\r
-  }\r
-\r
-  // high level functions\r
-\r
-  /**\r
-   * process a request_token request\r
-   * returns the request token on success\r
-   */\r
-  public function fetch_request_token(&$request) {\r
-    $this->get_version($request);\r
-\r
-    $consumer = $this->get_consumer($request);\r
-\r
-    // no token required for the initial token request\r
-    $token = NULL;\r
-\r
-    $this->check_signature($request, $consumer, $token);\r
-\r
-    // Rev A change\r
-    $callback = $request->get_parameter('oauth_callback');\r
-    $new_token = $this->data_store->new_request_token($consumer, $callback);\r
-\r
-    return $new_token;\r
-  }\r
-\r
-  /**\r
-   * process an access_token request\r
-   * returns the access token on success\r
-   */\r
-  public function fetch_access_token(&$request) {\r
-    $this->get_version($request);\r
-\r
-    $consumer = $this->get_consumer($request);\r
-\r
-    // requires authorized request token\r
-    $token = $this->get_token($request, $consumer, "request");\r
-\r
-    $this->check_signature($request, $consumer, $token);\r
-\r
-    // Rev A change\r
-    $verifier = $request->get_parameter('oauth_verifier');\r
-    $new_token = $this->data_store->new_access_token($token, $consumer, $verifier);\r
-\r
-    return $new_token;\r
-  }\r
-\r
-  /**\r
-   * verify an api call, checks all the parameters\r
-   */\r
-  public function verify_request(&$request) {\r
-    $this->get_version($request);\r
-    $consumer = $this->get_consumer($request);\r
-    $token = $this->get_token($request, $consumer, "access");\r
-    $this->check_signature($request, $consumer, $token);\r
-    return array($consumer, $token);\r
-  }\r
-\r
-  // Internals from here\r
-  /**\r
-   * version 1\r
-   */\r
-  private function get_version(&$request) {\r
-    $version = $request->get_parameter("oauth_version");\r
-    if (!$version) {\r
-      // Service Providers MUST assume the protocol version to be 1.0 if this parameter is not present. \r
-      // Chapter 7.0 ("Accessing Protected Ressources")\r
-      $version = '1.0';\r
-    }\r
-    if ($version !== $this->version) {\r
-      throw new OAuthException("OAuth version '$version' not supported");\r
-    }\r
-    return $version;\r
-  }\r
-\r
-  /**\r
-   * figure out the signature with some defaults\r
-   */\r
-  private function get_signature_method(&$request) {\r
-    $signature_method =\r
-        @$request->get_parameter("oauth_signature_method");\r
-\r
-    if (!$signature_method) {\r
-      // According to chapter 7 ("Accessing Protected Ressources") the signature-method\r
-      // parameter is required, and we can't just fallback to PLAINTEXT\r
-      throw new OAuthException('No signature method parameter. This parameter is required');\r
-    }\r
-\r
-    if (!in_array($signature_method,\r
-                  array_keys($this->signature_methods))) {\r
-      throw new OAuthException(\r
-        "Signature method '$signature_method' not supported " .\r
-        "try one of the following: " .\r
-        implode(", ", array_keys($this->signature_methods))\r
-      );\r
-    }\r
-    return $this->signature_methods[$signature_method];\r
-  }\r
-\r
-  /**\r
-   * try to find the consumer for the provided request's consumer key\r
-   */\r
-  private function get_consumer(&$request) {\r
-    $consumer_key = @$request->get_parameter("oauth_consumer_key");\r
-    if (!$consumer_key) {\r
-      throw new OAuthException("Invalid consumer key");\r
-    }\r
-\r
-    $consumer = $this->data_store->lookup_consumer($consumer_key);\r
-    if (!$consumer) {\r
-      throw new OAuthException("Invalid consumer");\r
-    }\r
-\r
-    return $consumer;\r
-  }\r
-\r
-  /**\r
-   * try to find the token for the provided request's token key\r
-   */\r
-  private function get_token(&$request, $consumer, $token_type="access") {\r
-    $token_field = @$request->get_parameter('oauth_token');\r
-    $token = $this->data_store->lookup_token(\r
-      $consumer, $token_type, $token_field\r
-    );\r
-    if (!$token) {\r
-      throw new OAuthException("Invalid $token_type token: $token_field");\r
-    }\r
-    return $token;\r
-  }\r
-\r
-  /**\r
-   * all-in-one function to check the signature on a request\r
-   * should guess the signature method appropriately\r
-   */\r
-  private function check_signature(&$request, $consumer, $token) {\r
-    // this should probably be in a different method\r
-    $timestamp = @$request->get_parameter('oauth_timestamp');\r
-    $nonce = @$request->get_parameter('oauth_nonce');\r
-\r
-    $this->check_timestamp($timestamp);\r
-    $this->check_nonce($consumer, $token, $nonce, $timestamp);\r
-\r
-    $signature_method = $this->get_signature_method($request);\r
-\r
-    $signature = $request->get_parameter('oauth_signature');\r
-    $valid_sig = $signature_method->check_signature(\r
-      $request,\r
-      $consumer,\r
-      $token,\r
-      $signature\r
-    );\r
-\r
-    if (!$valid_sig) {\r
-      throw new OAuthException("Invalid signature");\r
-    }\r
-  }\r
-\r
-  /**\r
-   * check that the timestamp is new enough\r
-   */\r
-  private function check_timestamp($timestamp) {\r
-    if( ! $timestamp )\r
-      throw new OAuthException(\r
-        'Missing timestamp parameter. The parameter is required'\r
-      );\r
-    \r
-    // verify that timestamp is recentish\r
-    $now = time();\r
-    if (abs($now - $timestamp) > $this->timestamp_threshold) {\r
-      throw new OAuthException(\r
-        "Expired timestamp, yours $timestamp, ours $now"\r
-      );\r
-    }\r
-  }\r
-\r
-  /**\r
-   * check that the nonce is not repeated\r
-   */\r
-  private function check_nonce($consumer, $token, $nonce, $timestamp) {\r
-    if( ! $nonce )\r
-      throw new OAuthException(\r
-        'Missing nonce parameter. The parameter is required'\r
-      );\r
-\r
-    // verify that the nonce is uniqueish\r
-    $found = $this->data_store->lookup_nonce(\r
-      $consumer,\r
-      $token,\r
-      $nonce,\r
-      $timestamp\r
-    );\r
-    if ($found) {\r
-      throw new OAuthException("Nonce already used: $nonce");\r
-    }\r
-  }\r
-\r
-}\r
-\r
-class OAuthDataStore {\r
-  function lookup_consumer($consumer_key) {\r
-    // implement me\r
-  }\r
-\r
-  function lookup_token($consumer, $token_type, $token) {\r
-    // implement me\r
-  }\r
-\r
-  function lookup_nonce($consumer, $token, $nonce, $timestamp) {\r
-    // implement me\r
-  }\r
-\r
-  function new_request_token($consumer, $callback = null) {\r
-    // return a new token attached to this consumer\r
-  }\r
-\r
-  function new_access_token($token, $consumer, $verifier = null) {\r
-    // return a new access token attached to this consumer\r
-    // for the user associated with this token if the request token\r
-    // is authorized\r
-    // should also invalidate the request token\r
-  }\r
-\r
-}\r
-\r
-class OAuthUtil {\r
-  public static function urlencode_rfc3986($input) {\r
-  if (is_array($input)) {\r
-    return array_map(array('OAuthUtil', 'urlencode_rfc3986'), $input);\r
-  } else if (is_scalar($input)) {\r
-    return str_replace(\r
-      '+',\r
-      ' ',\r
-      str_replace('%7E', '~', rawurlencode($input))\r
-    );\r
-  } else {\r
-    return '';\r
-  }\r
-}\r
-\r
-\r
-  // This decode function isn't taking into consideration the above\r
-  // modifications to the encoding process. However, this method doesn't\r
-  // seem to be used anywhere so leaving it as is.\r
-  public static function urldecode_rfc3986($string) {\r
-    return urldecode($string);\r
-  }\r
-\r
-  // Utility function for turning the Authorization: header into\r
-  // parameters, has to do some unescaping\r
-  // Can filter out any non-oauth parameters if needed (default behaviour)\r
-  public static function split_header($header, $only_allow_oauth_parameters = true) {\r
-    $pattern = '/(([-_a-z]*)=("([^"]*)"|([^,]*)),?)/';\r
-    $offset = 0;\r
-    $params = array();\r
-    while (preg_match($pattern, $header, $matches, PREG_OFFSET_CAPTURE, $offset) > 0) {\r
-      $match = $matches[0];\r
-      $header_name = $matches[2][0];\r
-      $header_content = (isset($matches[5])) ? $matches[5][0] : $matches[4][0];\r
-      if (preg_match('/^oauth_/', $header_name) || !$only_allow_oauth_parameters) {\r
-        $params[$header_name] = OAuthUtil::urldecode_rfc3986($header_content);\r
-      }\r
-      $offset = $match[1] + strlen($match[0]);\r
-    }\r
-\r
-    if (isset($params['realm'])) {\r
-      unset($params['realm']);\r
-    }\r
-\r
-    return $params;\r
-  }\r
-\r
-  // helper to try to sort out headers for people who aren't running apache\r
-  public static function get_headers() {\r
-    if (function_exists('apache_request_headers')) {\r
-      // we need this to get the actual Authorization: header\r
-      // because apache tends to tell us it doesn't exist\r
-      $headers = apache_request_headers();\r
-\r
-      // sanitize the output of apache_request_headers because\r
-      // we always want the keys to be Cased-Like-This and arh()\r
-      // returns the headers in the same case as they are in the\r
-      // request\r
-      $out = array();\r
-      foreach( $headers AS $key => $value ) {\r
-        $key = str_replace(\r
-            " ",\r
-            "-",\r
-            ucwords(strtolower(str_replace("-", " ", $key)))\r
-          );\r
-        $out[$key] = $value;\r
-      }\r
-    } else {\r
-      // otherwise we don't have apache and are just going to have to hope\r
-      // that $_SERVER actually contains what we need\r
-      $out = array();\r
-      if( isset($_SERVER['CONTENT_TYPE']) )\r
-        $out['Content-Type'] = $_SERVER['CONTENT_TYPE'];\r
-      if( isset($_ENV['CONTENT_TYPE']) )\r
-        $out['Content-Type'] = $_ENV['CONTENT_TYPE'];\r
-\r
-      foreach ($_SERVER as $key => $value) {\r
-        if (substr($key, 0, 5) == "HTTP_") {\r
-          // this is chaos, basically it is just there to capitalize the first\r
-          // letter of every word that is not an initial HTTP and strip HTTP\r
-          // code from przemek\r
-          $key = str_replace(\r
-            " ",\r
-            "-",\r
-            ucwords(strtolower(str_replace("_", " ", substr($key, 5))))\r
-          );\r
-          $out[$key] = $value;\r
-        }\r
-      }\r
-    }\r
-    return $out;\r
-  }\r
-\r
-  // This function takes a input like a=b&a=c&d=e and returns the parsed\r
-  // parameters like this\r
-  // array('a' => array('b','c'), 'd' => 'e')\r
-  public static function parse_parameters( $input ) {\r
-    if (!isset($input) || !$input) return array();\r
-\r
-    $pairs = explode('&', $input);\r
-\r
-    $parsed_parameters = array();\r
-    foreach ($pairs as $pair) {\r
-      $split = explode('=', $pair, 2);\r
-      $parameter = OAuthUtil::urldecode_rfc3986($split[0]);\r
-      $value = isset($split[1]) ? OAuthUtil::urldecode_rfc3986($split[1]) : '';\r
-\r
-      if (isset($parsed_parameters[$parameter])) {\r
-        // We have already recieved parameter(s) with this name, so add to the list\r
-        // of parameters with this name\r
-\r
-        if (is_scalar($parsed_parameters[$parameter])) {\r
-          // This is the first duplicate, so transform scalar (string) into an array\r
-          // so we can add the duplicates\r
-          $parsed_parameters[$parameter] = array($parsed_parameters[$parameter]);\r
-        }\r
-\r
-        $parsed_parameters[$parameter][] = $value;\r
-      } else {\r
-        $parsed_parameters[$parameter] = $value;\r
-      }\r
-    }\r
-    return $parsed_parameters;\r
-  }\r
-\r
-  public static function build_http_query($params) {\r
-    if (!$params) return '';\r
-\r
-    // Urlencode both keys and values\r
-    $keys = OAuthUtil::urlencode_rfc3986(array_keys($params));\r
-    $values = OAuthUtil::urlencode_rfc3986(array_values($params));\r
-    $params = array_combine($keys, $values);\r
-\r
-    // Parameters are sorted by name, using lexicographical byte value ordering.\r
-    // Ref: Spec: 9.1.1 (1)\r
-    uksort($params, 'strcmp');\r
-\r
-    $pairs = array();\r
-    foreach ($params as $parameter => $value) {\r
-      if (is_array($value)) {\r
-        // If two or more parameters share the same name, they are sorted by their value\r
-        // Ref: Spec: 9.1.1 (1)\r
-        natsort($value);\r
-        foreach ($value as $duplicate_value) {\r
-          $pairs[] = $parameter . '=' . $duplicate_value;\r
-        }\r
-      } else {\r
-        $pairs[] = $parameter . '=' . $value;\r
-      }\r
-    }\r
-    // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61)\r
-    // Each name-value pair is separated by an '&' character (ASCII code 38)\r
-    return implode('&', $pairs);\r
-  }\r
-}\r
-\r
-?>\r
diff --git a/tumblr/tumblroauth/tumblroauth.php b/tumblr/tumblroauth/tumblroauth.php
deleted file mode 100644 (file)
index 3c6f13c..0000000
+++ /dev/null
@@ -1,245 +0,0 @@
-<?php\r
-\r
-/*\r
- * Abraham Williams (abraham@abrah.am) http://abrah.am\r
- *\r
- * The first PHP Library to support OAuth for Tumblr's REST API.  (Originally for Twitter, modified for Tumblr by Lucas)\r
- */\r
-\r
-/* Load OAuth lib. You can find it at http://oauth.net */\r
-//require_once('OAuth.php');\r
-\r
-/**\r
- * Tumblr OAuth class\r
- */\r
-class TumblrOAuth {\r
-  /* Contains the last HTTP status code returned. */\r
-  public $http_code;\r
-  /* Contains the last API call. */\r
-  public $url;\r
-  /* Set up the API root URL. */\r
-  public $host = "http://api.tumblr.com/v2/";\r
-  /* Set timeout default. */\r
-  public $timeout = 30;\r
-  /* Set connect timeout. */\r
-  public $connecttimeout = 30; \r
-  /* Verify SSL Cert. */\r
-  public $ssl_verifypeer = FALSE;\r
-  /* Respons format. */\r
-  public $format = 'json';\r
-  /* Decode returned json data. */\r
-  public $decode_json = TRUE;\r
-  /* Contains the last HTTP headers returned. */\r
-  public $http_info;\r
-  /* Set the useragnet. */\r
-  public $useragent = 'TumblrOAuth v0.2.0-beta2';\r
-  /* Immediately retry the API call if the response was not successful. */\r
-  //public $retry = TRUE;\r
-\r
-\r
-\r
-\r
-  /**\r
-   * Set API URLS\r
-   */\r
-  function accessTokenURL()  { return 'http://www.tumblr.com/oauth/access_token'; }\r
-  function authenticateURL() { return 'http://www.tumblr.com/oauth/authorize'; }\r
-  function authorizeURL()    { return 'http://www.tumblr.com/oauth/authorize'; }\r
-  function requestTokenURL() { return 'http://www.tumblr.com/oauth/request_token'; }\r
-\r
-  /**\r
-   * Debug helpers\r
-   */\r
-  function lastStatusCode() { return $this->http_status; }\r
-  function lastAPICall() { return $this->last_api_call; }\r
-\r
-  /**\r
-   * construct TumblrOAuth object\r
-   */\r
-  function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) {\r
-    $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1();\r
-    $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret);\r
-    if (!empty($oauth_token) && !empty($oauth_token_secret)) {\r
-      $this->token = new OAuthConsumer($oauth_token, $oauth_token_secret);\r
-    } else {\r
-      $this->token = NULL;\r
-    }\r
-  }\r
-\r
-\r
-  /**\r
-   * Get a request_token from Tumblr\r
-   *\r
-   * @returns a key/value array containing oauth_token and oauth_token_secret\r
-   */\r
-  function getRequestToken($oauth_callback = NULL) {\r
-    $parameters = array();\r
-    if (!empty($oauth_callback)) {\r
-      $parameters['oauth_callback'] = $oauth_callback;\r
-    } \r
-    $request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters);\r
-    $token = OAuthUtil::parse_parameters($request);\r
-    $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);\r
-    return $token;\r
-  }\r
-\r
-  /**\r
-   * Get the authorize URL\r
-   *\r
-   * @returns a string\r
-   */\r
-  function getAuthorizeURL($token, $sign_in_with_tumblr = TRUE) {\r
-    if (is_array($token)) {\r
-      $token = $token['oauth_token'];\r
-    }\r
-    if (empty($sign_in_with_tumblr)) {\r
-      return $this->authorizeURL() . "?oauth_token={$token}";\r
-    } else {\r
-       return $this->authenticateURL() . "?oauth_token={$token}";\r
-    }\r
-  }\r
-\r
-  /**\r
-   * Exchange request token and secret for an access token and\r
-   * secret, to sign API calls.\r
-   *\r
-   * @returns array("oauth_token" => "the-access-token",\r
-   *                "oauth_token_secret" => "the-access-secret",\r
-   *                "user_id" => "9436992",\r
-   *                "screen_name" => "abraham")\r
-   */\r
-  function getAccessToken($oauth_verifier = FALSE) {\r
-    $parameters = array();\r
-    if (!empty($oauth_verifier)) {\r
-      $parameters['oauth_verifier'] = $oauth_verifier;\r
-    }\r
-    $request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters);\r
-    $token = OAuthUtil::parse_parameters($request);\r
-    $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);\r
-    return $token;\r
-  }\r
-\r
-  /**\r
-   * One time exchange of username and password for access token and secret.\r
-   *\r
-   * @returns array("oauth_token" => "the-access-token",\r
-   *                "oauth_token_secret" => "the-access-secret",\r
-   *                "user_id" => "9436992",\r
-   *                "screen_name" => "abraham",\r
-   *                "x_auth_expires" => "0")\r
-   */  \r
-  function getXAuthToken($username, $password) {\r
-    $parameters = array();\r
-    $parameters['x_auth_username'] = $username;\r
-    $parameters['x_auth_password'] = $password;\r
-    $parameters['x_auth_mode'] = 'client_auth';\r
-    $request = $this->oAuthRequest($this->accessTokenURL(), 'POST', $parameters);\r
-    $token = OAuthUtil::parse_parameters($request);\r
-    $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);\r
-    return $token;\r
-  }\r
-\r
-  /**\r
-   * GET wrapper for oAuthRequest.\r
-   */\r
-  function get($url, $parameters = array()) {\r
-    $response = $this->oAuthRequest($url, 'GET', $parameters);\r
-    if ($this->format === 'json' && $this->decode_json) {\r
-      return json_decode($response);\r
-    }\r
-    return $response;\r
-  }\r
-  \r
-  /**\r
-   * POST wrapper for oAuthRequest.\r
-   */\r
-  function post($url, $parameters = array()) {\r
-    $response = $this->oAuthRequest($url, 'POST', $parameters);\r
-    if ($this->format === 'json' && $this->decode_json) {\r
-      return json_decode($response);\r
-    }\r
-    return $response;\r
-  }\r
-\r
-  /**\r
-   * DELETE wrapper for oAuthReqeust.\r
-   */\r
-  function delete($url, $parameters = array()) {\r
-    $response = $this->oAuthRequest($url, 'DELETE', $parameters);\r
-    if ($this->format === 'json' && $this->decode_json) {\r
-      return json_decode($response);\r
-    }\r
-    return $response;\r
-  }\r
-\r
-  /**\r
-   * Format and sign an OAuth / API request\r
-   */\r
-  function oAuthRequest($url, $method, $parameters) {\r
-    if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0) {\r
-      $url = "{$this->host}{$url}";\r
-    }\r
-    $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);\r
-    $request->sign_request($this->sha1_method, $this->consumer, $this->token);\r
-    switch ($method) {\r
-    case 'GET':\r
-      return $this->http($request->to_url(), 'GET');\r
-    default:\r
-      return $this->http($request->get_normalized_http_url(), $method, $request->to_postdata());\r
-    }\r
-  }\r
-\r
-  /**\r
-   * Make an HTTP request\r
-   *\r
-   * @return API results\r
-   */\r
-  function http($url, $method, $postfields = NULL) {\r
-    $this->http_info = array();\r
-    $ci = curl_init();\r
-    /* Curl settings */\r
-    curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);\r
-    curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);\r
-    curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);\r
-    curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);\r
-    curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));\r
-    curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);\r
-    curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));\r
-    curl_setopt($ci, CURLOPT_HEADER, FALSE);\r
-\r
-    switch ($method) {\r
-      case 'POST':\r
-        curl_setopt($ci, CURLOPT_POST, TRUE);\r
-        if (!empty($postfields)) {\r
-          curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);\r
-        }\r
-        break;\r
-      case 'DELETE':\r
-        curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');\r
-        if (!empty($postfields)) {\r
-          $url = "{$url}?{$postfields}";\r
-        }\r
-    }\r
-\r
-    curl_setopt($ci, CURLOPT_URL, $url);\r
-    $response = curl_exec($ci);\r
-    $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);\r
-    $this->http_info = array_merge($this->http_info, curl_getinfo($ci));\r
-    $this->url = $url;\r
-    curl_close ($ci);\r
-    return $response;\r
-  }\r
-\r
-  /**\r
-   * Get the header info to store.\r
-   */\r
-  function getHeader($ch, $header) {\r
-    $i = strpos($header, ':');\r
-    if (!empty($i)) {\r
-      $key = str_replace('-', '_', strtolower(substr($header, 0, $i)));\r
-      $value = trim(substr($header, $i + 2));\r
-      $this->http_header[$key] = $value;\r
-    }\r
-    return strlen($header);\r
-  }\r
-}\r
index 062cc88805d0f08c09c3660433c8d02f42eb1711..496cce20dbe65087330a248d3a9f80c718de0220 100644 (file)
@@ -1,4 +1,4 @@
-Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel
+Copyright (c) 2011-2018 Tobias Diekershoff, Michael Vogel, Hypolite Petovan
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
index e3f58e8df4ae0ee1dd644ce91b212c3b1106ebed..5a48869007148fa3610e5fae4b8c9fcf4ab47185 100644 (file)
@@ -1,39 +1,23 @@
-Twitter Plugin
+Twitter Addon
 ==============
 
-Main authors Tobias Diekershoff and Michael Vogel.
+Main authors Tobias Diekershoff, Michael Vogel and Hypolite Petovan.
 
-With this addon to friendica you can give your users the possibility to post their *public* messages to Twitter and 
-to import their timeline. The messages will be strapped their rich context and shortened to 140 characters length if 
-necessary.
+This bi-directional connector addon allows each user to crosspost their Friendica public posts to Twitter, import their
+Twitter timeline, interact with tweets from Friendica, and crosspost to Friendica their public tweets.
 
-The addon can also mirror a users Tweets into the ~friendica wall.
+## Installation
 
-Installation
-------------
+To use this addon you have to register an [application](https://apps.twitter.com/) for your Friendica instance on Twitter.
+Please leave the field "Callback URL" empty.
 
-To use this plugin you have to register an [application](https://apps.twitter.com/) for your friendica instance on Twitter. Please leave the field "Callback URL" empty.
+After the registration please enter the values for "Consumer Key" and "Consumer Secret" in the [administration](admin/addons/twitter).
 
-After the registration please enter the values for "Consumer Key" and "Consumer Secret" in the [administration](admin/plugins/twitter).
+## License
 
-Where to find
--------------
-
-In the friendica addon git repository /twitter/, this directory contains
-all required PHP files (including the [Twitter OAuth library][1] by Abraham
-Williams, MIT licensed and the [Slinky library][2] by Beau Lebens, BSD license),
-a CSS file for styling of the user configuration and an image to _Sign in with
-Twitter_.
-
-[1]: https://github.com/abraham/twitteroauth
-[2]: http://dentedreality.com.au/projects/slinky/
-
-License
-=======
-
-The _StatusNet Connector_ is licensed under the [3-clause BSD license][3] see the
-LICENSE file in the addons directory.
-
-[3]: http://opensource.org/licenses/BSD-3-Clause
+The _Twitter Connector_ is licensed under the [3-clause BSD license][2] see the LICENSE file in the addons directory.
 
+The _Twitter Connector_ uses the [Twitter OAuth library][2] by Abraham Williams, MIT licensed
 
+[1]: http://opensource.org/licenses/BSD-3-Clause
+[2]: https://github.com/abraham/twitteroauth
diff --git a/twitter/cacert.pem b/twitter/cacert.pem
deleted file mode 100644 (file)
index 99b310b..0000000
+++ /dev/null
@@ -1,3895 +0,0 @@
-##
-## ca-bundle.crt -- Bundle of CA Root Certificates
-##
-## Certificate data from Mozilla as of: Sat Dec 29 20:03:40 2012
-##
-## This is a bundle of X.509 certificates of public Certificate Authorities
-## (CA). These were automatically extracted from Mozilla's root certificates
-## file (certdata.txt).  This file can be found in the mozilla source tree:
-## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
-##
-## It contains the certificates in PEM format and therefore
-## can be directly used with curl / libcurl / php_curl, or with
-## an Apache+mod_ssl webserver for SSL client authentication.
-## Just configure this file as the SSLCACertificateFile.
-##
-
-# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.87 $ $Date: 2012/12/29 16:32:45 $
-
-GTE CyberTrust Global Root
-==========================
------BEGIN CERTIFICATE-----
-MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
-Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG
-A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz
-MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
-Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0
-IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u
-sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql
-HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID
-AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW
-M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF
-NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
------END CERTIFICATE-----
-
-Thawte Server CA
-================
------BEGIN CERTIFICATE-----
-MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
-DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
-dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
-AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
-b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
-BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
-c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
-A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
-ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
-/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
-1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
-MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
-GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
-GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
------END CERTIFICATE-----
-
-Thawte Premium Server CA
-========================
------BEGIN CERTIFICATE-----
-MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
-DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
-dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
-AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
-ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
-AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
-VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
-aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
-cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
-aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
-Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
-qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
-SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
-8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
-UCemDaYj+bvLpgcUQg==
------END CERTIFICATE-----
-
-Equifax Secure CA
-=================
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
-ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
-MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
-B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
-nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
-fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
-8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
-A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
-CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
-A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
-spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
-Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
-zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
-BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
-70+sB3c4
------END CERTIFICATE-----
-
-Digital Signature Trust Co. Global CA 1
-=======================================
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
-ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy
-MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
-IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE
-NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i
-o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
-BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
-dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
-IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY
-MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM
-BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
-ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq
-kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4
-RbyhkwS7hp86W0N6w4pl
------END CERTIFICATE-----
-
-Digital Signature Trust Co. Global CA 3
-=======================================
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
-ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy
-MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
-IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA
-A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD
-VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS
-xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
-BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
-dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
-IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
-MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM
-BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
-AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi
-up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1
-mPnHfxsb1gYgAlihw6ID
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority
-=======================================================
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
-FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
-XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
-IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
-f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
-hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
-TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
-WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
-Tqj/ZA1k
------END CERTIFICATE-----
-
-Verisign Class 1 Public Primary Certification Authority - G2
-============================================================
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd
-k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq
-WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB
-MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM
-XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC
-lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ
------END CERTIFICATE-----
-
-Verisign Class 2 Public Primary Certification Authority - G2
-============================================================
------BEGIN CERTIFICATE-----
-MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
-cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
-Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
-c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
-cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
-Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
-c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx
-nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC
-wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA
-ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK
-1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk
-LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg==
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority - G2
-============================================================
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
-dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
-FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
-lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
-MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
-1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
-Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
------END CERTIFICATE-----
-
-GlobalSign Root CA
-==================
------BEGIN CERTIFICATE-----
-MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
-GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
-b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
-BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
-VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
-DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
-THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
-Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
-c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
-gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
-AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
-Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
-j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
-hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
-X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
------END CERTIFICATE-----
-
-GlobalSign Root CA - R2
-=======================
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
-YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
-bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
-aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
-bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
-ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
-s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
-S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
-TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
-ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
-FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
-YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
-BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
-9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
-01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
-9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
-TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
------END CERTIFICATE-----
-
-ValiCert Class 1 VA
-===================
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
-b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
-bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy
-MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
-d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg
-UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
-LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi
-GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm
-DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG
-lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX
-icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP
-Orf1LXLI
------END CERTIFICATE-----
-
-ValiCert Class 2 VA
-===================
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
-b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
-bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
-MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
-d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg
-UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
-LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC
-CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf
-ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ
-SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV
-UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8
-W9ViH0Pd
------END CERTIFICATE-----
-
-RSA Root Certificate 1
-======================
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
-b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
-YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
-bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
-MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
-d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg
-UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
-LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td
-3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H
-BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs
-3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF
-V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r
-on+jjBXu
------END CERTIFICATE-----
-
-Verisign Class 1 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E
-bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ
-rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+
-Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB
-FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
-q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N
-y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
-ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h
-a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc
-D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
------END CERTIFICATE-----
-
-Verisign Class 2 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT
-MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y
-azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug
-b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0
-aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ
-BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
-c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
-aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6
-tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7
-C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS
-0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs
-Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0
-JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf
-0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
-sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx
-JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j
-GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
-EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
-cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
-EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
-055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
-ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
-j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
-/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
-xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
-t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
------END CERTIFICATE-----
-
-Verisign Class 4 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
-tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
-8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
-Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
-Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
-j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
-mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
-fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
-RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
-UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
------END CERTIFICATE-----
-
-Entrust.net Secure Server CA
-============================
------BEGIN CERTIFICATE-----
-MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV
-BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg
-cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl
-ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG
-A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi
-eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p
-dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ
-aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5
-gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw
-ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw
-CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l
-dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
-bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
-dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw
-NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow
-HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
-BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN
-Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9
-n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
------END CERTIFICATE-----
-
-Entrust.net Premium 2048 Secure Server CA
-=========================================
------BEGIN CERTIFICATE-----
-MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
-ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
-bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
-BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
-NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
-d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
-MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
-ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
-Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
-hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
-nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
-VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC
-AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER
-gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
-AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
-oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS
-o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z
-2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX
-OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
------END CERTIFICATE-----
-
-Baltimore CyberTrust Root
-=========================
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
-ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
-ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
-SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
-dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
-uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
-UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
-G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
-XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
-l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
-VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
-BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
-cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
-hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
-Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
-RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
------END CERTIFICATE-----
-
-Equifax Secure Global eBusiness CA
-==================================
------BEGIN CERTIFICATE-----
-MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
-bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
-HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
-b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
-PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
-qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
-hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
-BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
-MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
-I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
-NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
------END CERTIFICATE-----
-
-Equifax Secure eBusiness CA 1
-=============================
------BEGIN CERTIFICATE-----
-MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB
-LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE
-ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz
-IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ
-1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a
-IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk
-MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW
-Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF
-AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5
-lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
-KpYrtWKmpj29f5JZzVoqgrI3eQ==
------END CERTIFICATE-----
-
-Equifax Secure eBusiness CA 2
-=============================
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE
-ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
-MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
-DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB
-nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn
-2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5
-BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG
-A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx
-JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG
-A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e
-uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB
-Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1
-jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia
-78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm
-V+GRMOrN
------END CERTIFICATE-----
-
-AddTrust Low-Value Services Root
-================================
------BEGIN CERTIFICATE-----
-MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
-cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
-CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
-ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
-54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
-oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
-Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
-GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
-HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
-AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
-RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
-HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
-ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
-iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
-eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
-mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
-ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
------END CERTIFICATE-----
-
-AddTrust External Root
-======================
------BEGIN CERTIFICATE-----
-MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
-VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
-NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
-cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
-Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
-+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
-Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
-aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
-2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
-7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
-BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
-VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
-VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
-IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
-j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
-6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
-e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
-G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
------END CERTIFICATE-----
-
-AddTrust Public Services Root
-=============================
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
-cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
-BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
-dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
-nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
-d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
-Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
-HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
-A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
-FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
-A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
-JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
-+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
-GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
-Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
-EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
------END CERTIFICATE-----
-
-AddTrust Qualified Certificates Root
-====================================
------BEGIN CERTIFICATE-----
-MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
-QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
-cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
-CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
-IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
-64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
-KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
-L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
-wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
-MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
-BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
-azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
-ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
-GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
-dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
-RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
-iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
------END CERTIFICATE-----
-
-Entrust Root Certification Authority
-====================================
------BEGIN CERTIFICATE-----
-MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
-BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
-b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
-A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
-MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
-MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
-Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
-dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
-A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
-Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
-j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
-rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
-DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
-MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
-hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
-A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
-Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
-v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
-W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
-tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
------END CERTIFICATE-----
-
-RSA Security 2048 v3
-====================
------BEGIN CERTIFICATE-----
-MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
-ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
-MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
-BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
-Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
-WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
-KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
-+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
-MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
-FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
-v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
-0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
-VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
-nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
-pKnXwiJPZ9d37CAFYd4=
------END CERTIFICATE-----
-
-GeoTrust Global CA
-==================
------BEGIN CERTIFICATE-----
-MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
-Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
-MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
-LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
-BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
-8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
-T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
-vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
-AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
-DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
-zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
-d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
-mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
-XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
-Mw==
------END CERTIFICATE-----
-
-GeoTrust Global CA 2
-====================
------BEGIN CERTIFICATE-----
-MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
-R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
-MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
-LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
-NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
-LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
-Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
-HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
-K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
-srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
-ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
-OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
-x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
-H4z1Ir+rzoPz4iIprn2DQKi6bA==
------END CERTIFICATE-----
-
-GeoTrust Universal CA
-=====================
------BEGIN CERTIFICATE-----
-MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
-R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
-MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
-Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
-JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
-RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
-7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
-8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
-qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
-Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
-Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
-KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
-ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
-XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
-hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
-aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
-qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
-oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
-xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
-KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
-DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
-xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
-p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
-P/rmMuGNG2+k5o7Y+SlIis5z/iw=
------END CERTIFICATE-----
-
-GeoTrust Universal CA 2
-=======================
------BEGIN CERTIFICATE-----
-MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
-R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
-MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
-SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
-A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
-DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
-j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
-JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
-QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
-WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
-20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
-ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
-SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
-8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
-+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
-BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
-dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
-4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
-mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
-A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
-Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
-pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
-FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
-gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
-X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
------END CERTIFICATE-----
-
-UTN-USER First-Network Applications
-===================================
------BEGIN CERTIFICATE-----
-MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp
-BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5
-WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T
-YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
-dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB
-cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug
-mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj
-DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu
-Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi
-P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE
-j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w
-HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j
-cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G
-CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y
-IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK
-RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp
-xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq
-DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE
------END CERTIFICATE-----
-
-America Online Root Certification Authority 1
-=============================================
------BEGIN CERTIFICATE-----
-MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
-A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
-T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
-v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
-DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
-sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
-8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
-AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
-o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
-GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
-VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
-3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
-Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
-sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
------END CERTIFICATE-----
-
-America Online Root Certification Authority 2
-=============================================
------BEGIN CERTIFICATE-----
-MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG
-A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
-T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en
-fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8
-f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO
-qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN
-RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0
-gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn
-6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid
-FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6
-Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj
-B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
-aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
-AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY
-T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p
-+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg
-JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy
-zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO
-ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh
-1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf
-GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff
-Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP
-cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
------END CERTIFICATE-----
-
-Visa eCommerce Root
-===================
------BEGIN CERTIFICATE-----
-MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
-EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
-QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
-WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
-VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
-bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
-F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
-RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
-TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
-/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
-GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
-MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
-CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
-YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
-zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
-YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
-398znM/jra6O1I7mT1GvFpLgXPYHDw==
------END CERTIFICATE-----
-
-Certum Root CA
-==============
------BEGIN CERTIFICATE-----
-MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
-ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
-Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
-by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
-wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
-kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
-89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
-Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
-NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
-hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
-GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
-GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
-0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
-qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
------END CERTIFICATE-----
-
-Comodo AAA Services root
-========================
------BEGIN CERTIFICATE-----
-MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
-R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
-TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
-MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
-c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
-BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
-C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
-i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
-Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
-Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
-Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
-BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
-cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
-LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
-7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
-Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
-8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
-12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
------END CERTIFICATE-----
-
-Comodo Secure Services root
-===========================
------BEGIN CERTIFICATE-----
-MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
-R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
-TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
-MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
-Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
-BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
-9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
-rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
-oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
-p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
-FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
-gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
-YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
-aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
-4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
-Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
-DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
-pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
-RR3B7Hzs/Sk=
------END CERTIFICATE-----
-
-Comodo Trusted Services root
-============================
------BEGIN CERTIFICATE-----
-MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
-R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
-TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
-MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
-bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
-IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
-3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
-/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
-juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
-ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
-DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
-ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
-cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
-uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
-pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
-BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
-R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
-9y5Xt5hwXsjEeLBi
------END CERTIFICATE-----
-
-QuoVadis Root CA
-================
------BEGIN CERTIFICATE-----
-MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
-ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
-eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
-MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
-cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
-EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
-J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
-F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
-YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
-AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
-PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
-ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
-MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
-YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
-ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
-Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
-Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
-BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
-FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
-tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
-fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
-LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
-gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
-5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
-5nrQNiOKSnQ2+Q==
------END CERTIFICATE-----
-
-QuoVadis Root CA 2
-==================
------BEGIN CERTIFICATE-----
-MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
-EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
-ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
-DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
-XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
-lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
-lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
-lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
-66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
-wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
-D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
-BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
-J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
-DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
-a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
-ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
-Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
-UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
-VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
-+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
-IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
-WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
-f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
-4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
-VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
------END CERTIFICATE-----
-
-QuoVadis Root CA 3
-==================
------BEGIN CERTIFICATE-----
-MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
-EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
-OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
-DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
-DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
-KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
-DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
-BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
-p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
-nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
-MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
-Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
-uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
-BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
-YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
-aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
-BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
-VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
-ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
-AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
-qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
-hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
-POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
-Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
-8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
-bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
-g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
-vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
-qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
------END CERTIFICATE-----
-
-Security Communication Root CA
-==============================
------BEGIN CERTIFICATE-----
-MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
-U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
-HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
-U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
-8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
-DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
-5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
-DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
-JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
-DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
-0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
-mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
-s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
-6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
-FL39vmwLAw==
------END CERTIFICATE-----
-
-Sonera Class 1 Root CA
-======================
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
-U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw
-NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
-IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88
-7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9
-EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl
-0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645
-2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa
-HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT
-iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9
-28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV
-yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR
-vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P
-qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z
-IRlXvVWa
------END CERTIFICATE-----
-
-Sonera Class 2 Root CA
-======================
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
-U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
-NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
-IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
-/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
-dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
-f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
-tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
-nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
-XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
-0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
-cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
-Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
-EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
-llpwrN9M
------END CERTIFICATE-----
-
-Staat der Nederlanden Root CA
-=============================
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
-ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
-Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
-HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
-bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
-vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
-jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
-C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
-vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
-22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
-HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
-dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
-BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
-EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
-MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
-nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
-iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
------END CERTIFICATE-----
-
-TDC Internet Root CA
-====================
------BEGIN CERTIFICATE-----
-MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE
-ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx
-NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu
-ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j
-xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL
-znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc
-5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6
-otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI
-AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM
-VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM
-MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC
-AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe
-UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G
-CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m
-gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
-2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb
-O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU
-Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l
------END CERTIFICATE-----
-
-TDC OCES Root CA
-================
------BEGIN CERTIFICATE-----
-MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE
-ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5
-MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH
-nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0
-zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV
-iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde
-dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO
-3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB
-5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k
-ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm
-cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp
-Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x
-LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM
-MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm
-aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy
-MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647
-+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6
-NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4
-A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc
-A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9
-AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1
-AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw==
------END CERTIFICATE-----
-
-UTN DATACorp SGC Root CA
-========================
------BEGIN CERTIFICATE-----
-MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
-BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
-MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
-HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
-dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
-raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
-wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
-9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
-33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
-DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
-BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
-LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
-DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
-Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
-I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
-EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
-DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
------END CERTIFICATE-----
-
-UTN USERFirst Email Root CA
-===========================
------BEGIN CERTIFICATE-----
-MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0
-BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05
-OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx
-FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx
-ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz
-dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx
-B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8
-om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG
-TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl
-yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE
-AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV
-HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll
-bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH
-AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne
-xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+
-5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV
-NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ
-w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ=
------END CERTIFICATE-----
-
-UTN USERFirst Hardware Root CA
-==============================
------BEGIN CERTIFICATE-----
-MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
-BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
-OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
-eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
-ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
-wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
-tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
-i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
-Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
-gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
-lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
-UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
-BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
-//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
-XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
-lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
-iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
-nfhmqA==
------END CERTIFICATE-----
-
-UTN USERFirst Object Root CA
-============================
------BEGIN CERTIFICATE-----
-MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb
-BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz
-NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx
-HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy
-dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR
-loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ
-w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu
-lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7
-RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL
-BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8
-ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly
-c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw
-DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw
-NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO
-PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE
-qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG
-hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g=
------END CERTIFICATE-----
-
-Camerfirma Chambers of Commerce Root
-====================================
------BEGIN CERTIFICATE-----
-MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
-QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
-ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
-NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
-cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
-MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
-AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
-xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
-NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
-DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
-d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
-EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
-cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
-AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
-bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
-VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
-aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
-fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
-L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
-UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
-ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
-erfutGWaIZDgqtCYvDi1czyL+Nw=
------END CERTIFICATE-----
-
-Camerfirma Global Chambersign Root
-==================================
------BEGIN CERTIFICATE-----
-MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
-QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
-ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
-NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
-YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
-MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
-ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
-1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
-by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
-6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
-8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
-BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
-aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
-Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
-aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
-ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
-bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
-PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
-gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
-PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
-IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
-t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
------END CERTIFICATE-----
-
-NetLock Qualified (Class QA) Root
-=================================
------BEGIN CERTIFICATE-----
-MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
-CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
-BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn
-eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0
-bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER
-MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0
-LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0
-dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP
-aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV
-CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e
-8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb
-m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ
-0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM
-0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
-HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2
-YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh
-biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p
-a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz
-YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg
-YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg
-ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov
-L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr
-Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0
-aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg
-YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0
-IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3
-DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN
-wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg
-W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc
-R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR
-5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko
------END CERTIFICATE-----
-
-NetLock Notary (Class A) Root
-=============================
------BEGIN CERTIFICATE-----
-MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
-EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
-dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
-ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
-DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
-EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
-VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
-cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
-D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
-z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
-/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
-tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
-4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
-A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
-Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
-bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
-IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
-LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
-ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
-IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
-IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
-b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
-bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
-Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
-bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
-ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
-ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
-CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
-KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
-8CgHrTwXZoi1/baI
------END CERTIFICATE-----
-
-NetLock Business (Class B) Root
-===============================
------BEGIN CERTIFICATE-----
-MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
-CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
-BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg
-VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD
-VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv
-bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg
-VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
-iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S
-o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr
-1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
-HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ
-RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh
-dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0
-ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv
-c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
-YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
-c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz
-Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA
-bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
-IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2
-YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj
-cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM
-43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR
-stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI
------END CERTIFICATE-----
-
-NetLock Express (Class C) Root
-==============================
------BEGIN CERTIFICATE-----
-MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT
-CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
-BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD
-KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ
-BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
-dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j
-ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB
-jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z
-W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63
-euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw
-DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN
-RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn
-YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB
-IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i
-aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
-ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
-ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo
-dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y
-emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k
-IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ
-UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg
-YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2
-xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW
-gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==
------END CERTIFICATE-----
-
-XRamp Global CA Root
-====================
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
-BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
-dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
-HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
-U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
-IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
-foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
-zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
-AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
-xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
-oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
-AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
-/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
-qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
-nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
-8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
------END CERTIFICATE-----
-
-Go Daddy Class 2 CA
-===================
------BEGIN CERTIFICATE-----
-MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
-VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
-A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
-RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
-ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
-2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
-qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
-YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
-vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
-BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
-atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
-MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
-A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
-PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
-I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
-HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
-Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
-vZ8=
------END CERTIFICATE-----
-
-Starfield Class 2 CA
-====================
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
-U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
-MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
-A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
-SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
-bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
-JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
-epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
-F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
-MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
-hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
-bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
-QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
-afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
-PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
-xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
-KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
-QBFGmh95DmK/D5fs4C8fF5Q=
------END CERTIFICATE-----
-
-StartCom Certification Authority
-================================
------BEGIN CERTIFICATE-----
-MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
-U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
-ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
-NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
-LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
-U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
-ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
-o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
-Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
-eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
-2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
-6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
-osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
-untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
-UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
-37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
-FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
-Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
-YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
-AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
-Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
-U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
-LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
-cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
-dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
-AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
-3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
-vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
-fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
-fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
-EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
-yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
-1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
-lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
-g14=
------END CERTIFICATE-----
-
-Taiwan GRCA
-===========
------BEGIN CERTIFICATE-----
-MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
-EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
-DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
-dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
-w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
-BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
-1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
-htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
-J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
-Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
-B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
-O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
-lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
-HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
-09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
-TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
-Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
-Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
-D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
-DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
-Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
-7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
-CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
-+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
------END CERTIFICATE-----
-
-Firmaprofesional Root CA
-========================
------BEGIN CERTIFICATE-----
-MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT
-GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp
-Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA
-ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL
-MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT
-OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2
-ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V
-j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH
-lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf
-3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8
-NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww
-KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG
-AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud
-DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD
-ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
-u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf
-wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
-7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG
-VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
------END CERTIFICATE-----
-
-Wells Fargo Root CA
-===================
------BEGIN CERTIFICATE-----
-MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV
-BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
-MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl
-bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv
-MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX
-x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3
-E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5
-OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j
-sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj
-YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF
-BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD
-ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv
-m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
-OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
-x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023
-tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
------END CERTIFICATE-----
-
-Swisscom Root CA 1
-==================
------BEGIN CERTIFICATE-----
-MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
-EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
-dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
-MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
-aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
-IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
-MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
-NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
-AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
-b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
-7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
-cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
-WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
-haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
-MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
-HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
-BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
-MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
-jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
-MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
-VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
-vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
-OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
-1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
-nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
-x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
-NY6E0F/6MBr1mmz0DlP5OlvRHA==
------END CERTIFICATE-----
-
-DigiCert Assured ID Root CA
-===========================
------BEGIN CERTIFICATE-----
-MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
-IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
-MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
-ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
-9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
-UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
-/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
-oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
-GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
-66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
-hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
-EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
-SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
-8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
-+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
------END CERTIFICATE-----
-
-DigiCert Global Root CA
-=======================
------BEGIN CERTIFICATE-----
-MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
-HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
-MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
-dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
-TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
-BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
-4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
-7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
-o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
-8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
-BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
-EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
-tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
-UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
-CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
------END CERTIFICATE-----
-
-DigiCert High Assurance EV Root CA
-==================================
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
-KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
-MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
-MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
-Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
-Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
-OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
-MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
-NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
-h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
-Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
-JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
-V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
-myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
-mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
-vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
------END CERTIFICATE-----
-
-Certplus Class 2 Primary CA
-===========================
------BEGIN CERTIFICATE-----
-MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
-BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
-OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
-dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
-5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
-Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
-YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
-e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
-CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
-YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
-L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
-P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
-TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
-7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
-//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
-l7+ijrRU
------END CERTIFICATE-----
-
-DST Root CA X3
-==============
------BEGIN CERTIFICATE-----
-MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
-ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
-DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
-cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
-rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
-UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
-xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
-utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
-AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
-MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
-dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
-GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
-RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
-fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
------END CERTIFICATE-----
-
-DST ACES CA X6
-==============
------BEGIN CERTIFICATE-----
-MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
-EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
-MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
-MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
-CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
-DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
-pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
-GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
-MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
-EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
-Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
-dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
-CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
-5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
-Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
-nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
-vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
-oKfN5XozNmr6mis=
------END CERTIFICATE-----
-
-TURKTRUST Certificate Services Provider Root 1
-==============================================
------BEGIN CERTIFICATE-----
-MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
-MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
-acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
-MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
-U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
-TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
-aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
-yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
-Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
-8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
-W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
-BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
-sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
-q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
-B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
-nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
------END CERTIFICATE-----
-
-TURKTRUST Certificate Services Provider Root 2
-==============================================
------BEGIN CERTIFICATE-----
-MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
-MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
-QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
-MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
-dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
-A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
-acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
-LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
-x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
-QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
-5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
-AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
-A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
-Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
-Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
-hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
-9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
-UrbnBEI=
------END CERTIFICATE-----
-
-SwissSign Platinum CA - G2
-==========================
------BEGIN CERTIFICATE-----
-MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCQ0gxFTAT
-BgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWduIFBsYXRpbnVtIENBIC0gRzIw
-HhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMM
-U3dpc3NTaWduIEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJ
-KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu
-669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UF
-eNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kne
-WCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIo
-j5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/6
-8++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34T
-aNhxKFrYzt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjy
-domyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3HBqi7Ri6Cr2D
-+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuWae5ogObnmLo2t/5u7Su9IPhlGdpV
-CX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv
-zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW
-IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1
-Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3
-NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4
-U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8
-KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl
-9x8DYSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1B
-aYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyIIoK6q8QNs
-OktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSY
-Mdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAci
-IfNAChs0B0QTwoRqjt8ZWr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g==
------END CERTIFICATE-----
-
-SwissSign Gold CA - G2
-======================
------BEGIN CERTIFICATE-----
-MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
-EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
-MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
-c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
-t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
-jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
-vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
-ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
-AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
-jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
-peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
-7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
-GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
-OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
-L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
-5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
-44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
-Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
-Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
-mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
-vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
-KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
-NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
-viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
------END CERTIFICATE-----
-
-SwissSign Silver CA - G2
-========================
------BEGIN CERTIFICATE-----
-MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
-BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
-DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
-aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
-9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
-N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
-+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
-6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
-MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
-qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
-FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
-ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
-celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
-CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
-tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
-cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
-4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
-kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
-3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
-/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
-DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
-e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
-WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
-DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
-DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
------END CERTIFICATE-----
-
-GeoTrust Primary Certification Authority
-========================================
------BEGIN CERTIFICATE-----
-MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
-EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
-CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
-cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
-b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
-nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
-RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
-tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
-AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
-hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
-Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
-NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
-Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
-1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
------END CERTIFICATE-----
-
-thawte Primary Root CA
-======================
------BEGIN CERTIFICATE-----
-MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
-BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
-aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
-MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
-SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
-KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
-FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
-oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
-1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
-q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
-aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
-afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
-VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
-AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
-uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
-xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
-jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
-z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
------END CERTIFICATE-----
-
-VeriSign Class 3 Public Primary Certification Authority - G5
-============================================================
------BEGIN CERTIFICATE-----
-MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
-BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
-ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
-IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
-yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
-biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
-dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
-YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
-j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
-Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
-Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
-fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
-BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
-Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
-aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
-SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
-X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
-KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
-Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
-ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
------END CERTIFICATE-----
-
-SecureTrust CA
-==============
------BEGIN CERTIFICATE-----
-MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
-EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
-dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
-BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
-OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
-DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
-GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
-01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
-ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
-aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
-KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
-SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
-mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
-nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
-3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
------END CERTIFICATE-----
-
-Secure Global CA
-================
------BEGIN CERTIFICATE-----
-MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
-EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
-bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
-MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
-Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
-YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
-bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
-8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
-HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
-0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
-EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
-oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
-MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
-OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
-CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
-3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
-f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
------END CERTIFICATE-----
-
-COMODO Certification Authority
-==============================
------BEGIN CERTIFICATE-----
-MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
-BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
-A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
-MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
-T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
-+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
-xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
-4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
-1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
-rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
-b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
-AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
-OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
-RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
-IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
-+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
------END CERTIFICATE-----
-
-Network Solutions Certificate Authority
-=======================================
------BEGIN CERTIFICATE-----
-MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
-EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
-IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
-MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
-MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
-jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
-aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
-crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
-/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
-AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
-bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
-A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
-4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
-GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
-wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
-ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
------END CERTIFICATE-----
-
-WellsSecure Public Root Certificate Authority
-=============================================
------BEGIN CERTIFICATE-----
-MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
-F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
-NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
-MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
-bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
-VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
-iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
-i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
-bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
-K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
-AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
-cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
-lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
-i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
-GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
-Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
-K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
-bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
-qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
-E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
-tylv2G0xffX8oRAHh84vWdw+WNs=
------END CERTIFICATE-----
-
-COMODO ECC Certification Authority
-==================================
------BEGIN CERTIFICATE-----
-MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
-R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
-ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
-GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
-Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
-b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
-4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
-wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
-FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
-U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
------END CERTIFICATE-----
-
-IGC/A
-=====
------BEGIN CERTIFICATE-----
-MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
-VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
-Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
-MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
-EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
-STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
-TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
-So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
-HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
-frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
-tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
-egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
-iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
-q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
-MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
-Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
-lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
-0mBWWg==
------END CERTIFICATE-----
-
-Security Communication EV RootCA1
-=================================
------BEGIN CERTIFICATE-----
-MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
-U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
-dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
-BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
-Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
-/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
-WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
-ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
-bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
-9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
-SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
-iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
-Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
-mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
-T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
------END CERTIFICATE-----
-
-OISTE WISeKey Global Root GA CA
-===============================
------BEGIN CERTIFICATE-----
-MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
-BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
-A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
-bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
-VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
-IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
-IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
-Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
-Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
-d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
-/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
-LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
-KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
-MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
-+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
-hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
-okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
------END CERTIFICATE-----
-
-S-TRUST Authentication and Encryption Root CA 2005 PN
-=====================================================
------BEGIN CERTIFICATE-----
-MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
-BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh
-cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT
-LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w
-NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk
-ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj
-aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp
-b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob
-4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL
-g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf
-eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3
-KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB
-/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv
-bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU
-D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD
-pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08
-P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA
-nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit
-F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b
-Hz2eBIPdltkdOpQ=
------END CERTIFICATE-----
-
-Microsec e-Szigno Root CA
-=========================
------BEGIN CERTIFICATE-----
-MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
-BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
-EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
-MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
-dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
-GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
-AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
-d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
-oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
-QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
-PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
-MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
-IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
-VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
-LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
-dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
-AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
-4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
-AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
-egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
-Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
-PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
-c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
-cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
-IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
-WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
-MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
-MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
-Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
-HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
-nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
-aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
-86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
-yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
-S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
------END CERTIFICATE-----
-
-Certigna
-========
------BEGIN CERTIFICATE-----
-MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
-EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
-MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
-Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
-XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
-GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
-ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
-DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
-Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
-tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
-BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
-SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
-hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
-ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
-PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
-1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
-WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
------END CERTIFICATE-----
-
-AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
-======================================
------BEGIN CERTIFICATE-----
-MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT
-AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg
-LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w
-HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+
-U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh
-IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN
-yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU
-2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3
-4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP
-2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm
-8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf
-HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa
-Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK
-5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b
-czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
-AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g
-ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF
-BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug
-cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf
-AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX
-EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v
-/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3
-MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4
-3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk
-eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f
-/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h
-RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU
-Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ==
------END CERTIFICATE-----
-
-TC TrustCenter Class 2 CA II
-============================
------BEGIN CERTIFICATE-----
-MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
-IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
-MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
-c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
-AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
-IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
-xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
-Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
-SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
-7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
-Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
-cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
-SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
-TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
-dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
-KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
-TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
-JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
-vQ==
------END CERTIFICATE-----
-
-TC TrustCenter Class 3 CA II
-============================
------BEGIN CERTIFICATE-----
-MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
-IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw
-MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
-c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE
-AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W
-yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo
-6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ
-uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk
-2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB
-7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
-Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
-cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
-SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
-TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE
-O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8
-yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9
-IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal
-092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc
-5A==
------END CERTIFICATE-----
-
-TC TrustCenter Universal CA I
-=============================
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
-IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
-MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
-VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
-JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
-qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
-xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
-ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
-gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
-BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
-1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
-vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
-ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
-ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
-7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
------END CERTIFICATE-----
-
-Deutsche Telekom Root CA 2
-==========================
------BEGIN CERTIFICATE-----
-MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
-RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
-A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
-MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
-A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
-b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
-bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
-KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
-AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
-Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
-jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
-HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
-E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
-zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
-rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
-dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
-Cm26OWMohpLzGITY+9HPBVZkVw==
------END CERTIFICATE-----
-
-ComSign CA
-==========
------BEGIN CERTIFICATE-----
-MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD
-EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy
-MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp
-Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q
-ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy
-P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN
-GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk
-YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM
-rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy
-oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P
-AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+
-VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2
-QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI
-mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb
-/627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG
-zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U
-AGegcQCCSA==
------END CERTIFICATE-----
-
-ComSign Secured CA
-==================
------BEGIN CERTIFICATE-----
-MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
-AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
-NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
-QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
-49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
-7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
-kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
-9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
-AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
-U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
-j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
-AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
-BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
-FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
-51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
-OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
------END CERTIFICATE-----
-
-Cybertrust Global Root
-======================
------BEGIN CERTIFICATE-----
-MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
-ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
-MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
-ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
-+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
-0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
-AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
-89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
-8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
-MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
-A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
-lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
-5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
-hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
-X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
-WL1WMRJOEcgh4LMRkWXbtKaIOM5V
------END CERTIFICATE-----
-
-ePKI Root Certification Authority
-=================================
------BEGIN CERTIFICATE-----
-MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
-EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
-Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
-MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
-MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
-IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
-lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
-qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
-12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
-WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
-ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
-lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
-vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
-Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
-MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
-ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
-1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
-KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
-xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
-NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
-GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
-xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
-gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
-sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
-BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
------END CERTIFICATE-----
-
-T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
-=============================================================================================================================
------BEGIN CERTIFICATE-----
-MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
-DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
-aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
-b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
-BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
-S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
-MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
-IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
-n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
-IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
-dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
-cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
-Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
-xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
-6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
-hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
-BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
-MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
-N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
-y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
-LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
-dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
------END CERTIFICATE-----
-
-Buypass Class 2 CA 1
-====================
------BEGIN CERTIFICATE-----
-MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
-MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
-c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
-cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
-0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
-0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
-uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
-AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
-1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
-7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
-fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
-wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
------END CERTIFICATE-----
-
-Buypass Class 3 CA 1
-====================
------BEGIN CERTIFICATE-----
-MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
-MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
-c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
-ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
-n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
-AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
-1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
-AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
-pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
-EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
-htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
-el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
------END CERTIFICATE-----
-
-EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
-==========================================================================
------BEGIN CERTIFICATE-----
-MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
-QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
-Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
-ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
-IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
-X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
-gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
-eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
-TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
-Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
-uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
-qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
-ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
-Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
-/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
-Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
-FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
-zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
-XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
-bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
-RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
-1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
-2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
-Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
-AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
------END CERTIFICATE-----
-
-certSIGN ROOT CA
-================
------BEGIN CERTIFICATE-----
-MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
-VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
-Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
-CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
-JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
-rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
-ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
-0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
-AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
-Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
-AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
-SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
-x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
-vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
-TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
------END CERTIFICATE-----
-
-CNNIC ROOT
-==========
------BEGIN CERTIFICATE-----
-MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
-ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
-OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
-o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
-VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
-VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
-czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
-y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
-wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
-lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
-Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
-O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
-BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
-G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
-mxE=
------END CERTIFICATE-----
-
-ApplicationCA - Japanese Government
-===================================
------BEGIN CERTIFICATE-----
-MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
-SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
-MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
-cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
-fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
-wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
-jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
-nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
-WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
-BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
-vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
-o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
-/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
-io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
-dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
-rosot4LKGAfmt1t06SAZf7IbiVQ=
------END CERTIFICATE-----
-
-GeoTrust Primary Certification Authority - G3
-=============================================
------BEGIN CERTIFICATE-----
-MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
-BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
-IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
-eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
-NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
-YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
-LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
-K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
-c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
-IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
-dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
-2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
-cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
-Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
-AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
-t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
------END CERTIFICATE-----
-
-thawte Primary Root CA - G2
-===========================
------BEGIN CERTIFICATE-----
-MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
-VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
-IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
-Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
-MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
-b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
-IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
-LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
-8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
-mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
-G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
-rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
------END CERTIFICATE-----
-
-thawte Primary Root CA - G3
-===========================
------BEGIN CERTIFICATE-----
-MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
-BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
-aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
-ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
-d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
-VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
-A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
-P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
-+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
-7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
-vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
-KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
-A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
-t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
-8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
-er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
------END CERTIFICATE-----
-
-GeoTrust Primary Certification Authority - G2
-=============================================
------BEGIN CERTIFICATE-----
-MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
-Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
-OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
-MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
-b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
-BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
-KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
-VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
-EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
-ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
-npaqBA+K
------END CERTIFICATE-----
-
-VeriSign Universal Root Certification Authority
-===============================================
------BEGIN CERTIFICATE-----
-MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
-BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
-ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
-IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
-IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
-1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
-MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
-9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
-AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
-tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
-CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
-a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
-DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
-Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
-Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
-P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
-wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
-mJO37M2CYfE45k+XmCpajQ==
------END CERTIFICATE-----
-
-VeriSign Class 3 Public Primary Certification Authority - G4
-============================================================
------BEGIN CERTIFICATE-----
-MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
-VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
-b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
-ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
-cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
-b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
-Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
-rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
-/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
-HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
-Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
-A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
-AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
------END CERTIFICATE-----
-
-NetLock Arany (Class Gold) Főtanúsítvány
-============================================
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
-A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
-dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
-cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
-MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
-ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
-biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
-c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
-0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
-/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
-H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
-fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
-neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
-qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
-YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
-bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
-NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
-dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
------END CERTIFICATE-----
-
-Staat der Nederlanden Root CA - G2
-==================================
------BEGIN CERTIFICATE-----
-MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
-CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
-Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
-TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
-ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
-5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
-vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
-CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
-e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
-OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
-CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
-48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
-trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
-qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
-AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
-ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
-HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
-A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
-+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
-f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
-kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
-CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
-URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
-CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
-oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
-IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
-66+KAQ==
------END CERTIFICATE-----
-
-CA Disig
-========
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
-QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
-MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
-bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
-GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
-Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
-hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
-ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
-gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
-AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
-aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
-ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
-BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
-WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
-mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
-CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
-ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
-4Z7CRneC9VkGjCFMhwnN5ag=
------END CERTIFICATE-----
-
-Juur-SK
-=======
------BEGIN CERTIFICATE-----
-MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
-c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
-DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
-SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
-aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
-TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
-+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
-UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
-Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
-MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
-HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
-AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
-cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
-AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
-cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
-FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
-A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
-ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
-abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
-IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
-Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
-yyqcjg==
------END CERTIFICATE-----
-
-Hongkong Post Root CA 1
-=======================
------BEGIN CERTIFICATE-----
-MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
-DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
-NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
-IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
-ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
-auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
-qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
-V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
-HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
-h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
-l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
-IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
-T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
-c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
------END CERTIFICATE-----
-
-SecureSign RootCA11
-===================
------BEGIN CERTIFICATE-----
-MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
-SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
-b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
-KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
-cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
-TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
-wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
-g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
-O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
-bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
-t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
-OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
-bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
-Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
-y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
-lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
------END CERTIFICATE-----
-
-ACEDICOM Root
-=============
------BEGIN CERTIFICATE-----
-MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
-T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
-MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
-A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
-AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
-WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
-YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
-MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
-m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
-HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
-xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
-3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
-2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
-TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
-4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
-9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
-bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
-aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
-eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
-zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
-ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
-KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
-nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
-I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
-MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
-tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
------END CERTIFICATE-----
-
-Verisign Class 1 Public Primary Certification Authority
-=======================================================
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
-FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
-XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx
-IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ
-VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2
-yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa
-XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n
-0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ
-RjXZ+Hxb
------END CERTIFICATE-----
-
-Verisign Class 3 Public Primary Certification Authority
-=======================================================
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
-FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
-XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
-IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
-f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
-hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
-CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
-bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
-D/xwzoiQ
------END CERTIFICATE-----
-
-Microsec e-Szigno Root CA 2009
-==============================
------BEGIN CERTIFICATE-----
-MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
-MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
-c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
-dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
-BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
-U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
-fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
-0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
-pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
-1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
-AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
-QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
-FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
-lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
-I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
-tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
-yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
-LXpUq3DDfSJlgnCW
------END CERTIFICATE-----
-
-E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi
-===================================================
------BEGIN CERTIFICATE-----
-MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
-EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz
-ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3
-MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0
-cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u
-aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY
-8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y
-jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI
-JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk
-9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD
-AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG
-SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d
-F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq
-D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4
-Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
-fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
------END CERTIFICATE-----
-
-GlobalSign Root CA - R3
-=======================
------BEGIN CERTIFICATE-----
-MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
-YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
-bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
-aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
-bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
-iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
-0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
-rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
-OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
-xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
-FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
-lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
-EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
-bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
-YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
-kpeDMdmztcpHWD9f
------END CERTIFICATE-----
-
-TC TrustCenter Universal CA III
-===============================
------BEGIN CERTIFICATE-----
-MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
-IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe
-Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU
-QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex
-KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt
-QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO
-juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut
-CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1
-M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G
-A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
-BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA
-g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+
-KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK
-BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
-CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq
-woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
------END CERTIFICATE-----
-
-Autoridad de Certificacion Firmaprofesional CIF A62634068
-=========================================================
------BEGIN CERTIFICATE-----
-MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
-BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
-MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
-QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
-NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
-Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
-B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
-7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
-ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
-plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
-MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
-LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
-bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
-vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
-EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
-DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
-cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
-bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
-ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
-51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
-R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
-T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
-Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
-osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
-crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
-saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
-KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
-6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
------END CERTIFICATE-----
-
-Izenpe.com
-==========
------BEGIN CERTIFICATE-----
-MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
-EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
-MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
-QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
-03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
-ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
-+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
-PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
-OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
-F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
-0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
-0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
-leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
-AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
-SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
-NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
-MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
-BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
-Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
-kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
-hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
-g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
-aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
-nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
-ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
-Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
-WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
------END CERTIFICATE-----
-
-Chambers of Commerce Root - 2008
-================================
------BEGIN CERTIFICATE-----
-MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
-MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
-bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
-QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
-Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
-ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
-EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
-cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
-AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
-XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
-h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
-ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
-NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
-D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
-lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
-0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
-ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
-EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
-G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
-BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
-bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
-bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
-CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
-AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
-wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
-3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
-RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
-M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
-YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
-9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
-zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
-nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
-OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
------END CERTIFICATE-----
-
-Global Chambersign Root - 2008
-==============================
------BEGIN CERTIFICATE-----
-MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
-MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
-bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
-QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
-NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
-Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
-QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
-aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
-VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
-XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
-ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
-/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
-TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
-H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
-Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
-HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
-wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
-AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
-BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
-BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
-aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
-aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
-1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
-dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
-/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
-ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
-dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
-9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
-foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
-qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
-P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
-c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
-09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
------END CERTIFICATE-----
-
-Go Daddy Root Certificate Authority - G2
-========================================
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
-B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
-MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
-MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
-b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
-A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
-9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
-+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
-fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
-NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
-BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
-vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
-5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
-N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
-LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
------END CERTIFICATE-----
-
-Starfield Root Certificate Authority - G2
-=========================================
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
-B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
-b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
-eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
-DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
-VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
-dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
-W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
-bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
-N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
-ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
-JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
-TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
-4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
-F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
-pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
-c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
------END CERTIFICATE-----
-
-Starfield Services Root Certificate Authority - G2
-==================================================
------BEGIN CERTIFICATE-----
-MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
-B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
-b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
-IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
-BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
-dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
-Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
-h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
-hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
-LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
-rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
-AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
-SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
-E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
-xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
-iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
-YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
------END CERTIFICATE-----
-
-AffirmTrust Commercial
-======================
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
-BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
-MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
-bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
-DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
-C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
-BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
-MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
-HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
-hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
-qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
-0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
-sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
------END CERTIFICATE-----
-
-AffirmTrust Networking
-======================
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
-BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
-MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
-bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
-Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
-dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
-/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
-h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
-HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
-UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
-12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
-WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
-/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
------END CERTIFICATE-----
-
-AffirmTrust Premium
-===================
------BEGIN CERTIFICATE-----
-MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
-BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
-OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
-dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
-MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
-BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
-5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
-+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
-GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
-p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
-S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
-6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
-/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
-+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
-MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
-Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
-6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
-L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
-+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
-BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
-IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
-g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
-zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
------END CERTIFICATE-----
-
-AffirmTrust Premium ECC
-=======================
------BEGIN CERTIFICATE-----
-MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
-BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
-MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
-cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
-IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
-N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
-BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
-BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
-57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
-eQ==
------END CERTIFICATE-----
-
-Certum Trusted Network CA
-=========================
------BEGIN CERTIFICATE-----
-MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
-ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
-biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
-MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
-ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
-l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
-J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
-fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
-cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
-Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
-DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
-jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
-mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
-Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
-03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
------END CERTIFICATE-----
-
-Certinomis - Autorité Racine
-=============================
------BEGIN CERTIFICATE-----
-MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
-Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
-LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
-A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
-JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
-ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
-wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
-Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
-2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
-jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
-c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
-lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
-xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
-530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
-4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
-A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
-KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
-WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
-R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
-nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
-CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
-JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
-qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
-WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
-wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
-vgt2Fl43N+bYdJeimUV5
------END CERTIFICATE-----
-
-Root CA Generalitat Valenciana
-==============================
------BEGIN CERTIFICATE-----
-MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
-ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
-IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
-WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
-CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
-F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
-ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
-D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
-JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
-AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
-dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
-ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
-AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
-YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
-AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
-aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
-AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
-YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
-AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
-OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
-dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
-BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
-A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
-b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
-TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
-Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
-NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
-iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
-+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
------END CERTIFICATE-----
-
-A-Trust-nQual-03
-================
------BEGIN CERTIFICATE-----
-MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
-Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
-a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
-dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
-RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
-ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
-c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
-zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
-yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
-SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
-iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
-cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
-eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
-ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
-sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
-JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
-mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
-ahq97BvIxYSazQ==
------END CERTIFICATE-----
-
-TWCA Root Certification Authority
-=================================
------BEGIN CERTIFICATE-----
-MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
-VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
-EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
-IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
-QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
-oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
-4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
-y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
-BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
-9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
-mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
-QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
-T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
-Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
------END CERTIFICATE-----
-
-Security Communication RootCA2
-==============================
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
-U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
-dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
-SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
-aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
-+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
-3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
-spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
-EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
-QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
-CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
-u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
-3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
-tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
-mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
------END CERTIFICATE-----
-
-EC-ACC
-======
------BEGIN CERTIFICATE-----
-MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
-BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
-ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
-VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
-CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
-BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
-MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
-SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
-Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
-cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
-w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
-ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
-HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
-E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
-0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
-VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
-Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
-dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
-lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
-Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
-l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
-E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
-5EI=
------END CERTIFICATE-----
-
-Hellenic Academic and Research Institutions RootCA 2011
-=======================================================
------BEGIN CERTIFICATE-----
-MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
-O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
-aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
-IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
-AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
-IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
-IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
-1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
-71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
-8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
-3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
-MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
-MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
-b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
-XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
-TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
-/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
-7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
------END CERTIFICATE-----
-
-Actalis Authentication Root CA
-==============================
------BEGIN CERTIFICATE-----
-MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
-BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
-AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
-MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
-IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
-IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
-wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
-by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
-zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
-YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
-oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
-EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
-hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
-EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
-jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
-iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
-ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
-WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
-JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
-K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
-Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
-4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
-2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
-lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
-OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
-vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
------END CERTIFICATE-----
-
-Trustis FPS Root CA
-===================
------BEGIN CERTIFICATE-----
-MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
-EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
-IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
-BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
-KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
-RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
-H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
-cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
-o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
-AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
-BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
-GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
-yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
-8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
-l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
-iB6XzCGcKQENZetX2fNXlrtIzYE=
------END CERTIFICATE-----
-
-StartCom Certification Authority
-================================
------BEGIN CERTIFICATE-----
-MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
-U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
-ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
-NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
-LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
-U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
-ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
-o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
-Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
-eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
-2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
-6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
-osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
-untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
-UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
-37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
-VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
-Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
-dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
-c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
-bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
-aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
-aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
-L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
-cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
-fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
-N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
-Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
-tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
-e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
-2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
-HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
-JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
-D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
------END CERTIFICATE-----
-
-StartCom Certification Authority G2
-===================================
------BEGIN CERTIFICATE-----
-MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
-U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
-RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE
-ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O
-o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG
-4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi
-Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul
-Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs
-O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H
-vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L
-nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS
-FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa
-z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ
-KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
-2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk
-J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+
-JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG
-/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc
-nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld
-blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc
-l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm
-7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm
-obp573PYtlNXLfbQ4ddI
------END CERTIFICATE-----
-
-Buypass Class 2 Root CA
-=======================
------BEGIN CERTIFICATE-----
-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
-DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
-eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
-DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
-g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
-9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
-/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
-CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
-awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
-zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
-Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
-Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
-M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
-VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
-AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
-A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
-osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
-aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
-DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
-LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
-oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
-wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
-CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
-rJgWVqA=
------END CERTIFICATE-----
-
-Buypass Class 3 Root CA
-=======================
------BEGIN CERTIFICATE-----
-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
-DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
-eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
-DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
-sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
-5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
-7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
-ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
-2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
-/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
-RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
-Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
-j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
-VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
-AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
-cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
-uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
-Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
-ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
-KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
-6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
-UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
-eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
-Cp/HuZc=
------END CERTIFICATE-----
-
-T-TeleSec GlobalRoot Class 3
-============================
------BEGIN CERTIFICATE-----
-MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
-IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
-cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
-MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
-dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
-ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
-9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
-NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
-iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
-0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
-MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
-AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
-fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
-ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
-P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
-e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
------END CERTIFICATE-----
-
-EE Certification Centre Root CA
-===============================
------BEGIN CERTIFICATE-----
-MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
-EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
-dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
-MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
-UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
-ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
-DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
-TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
-rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
-93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
-P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
-AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
-MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
-BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
-xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
-lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
-uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
-3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
-dcGWxZ0=
------END CERTIFICATE-----
diff --git a/twitter/codebird.php b/twitter/codebird.php
deleted file mode 100644 (file)
index 898dc71..0000000
+++ /dev/null
@@ -1,1026 +0,0 @@
-<?php
-
-namespace Codebird;
-
-/**
- * A Twitter library in PHP.
- *
- * @package codebird
- * @version 2.4.1
- * @author J.M. <me@mynetx.net>
- * @copyright 2010-2013 J.M. <me@mynetx.net>
- *
- * 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/>.
- */
-
-/**
- * Define constants
- */
-$constants = explode(' ', 'OBJECT ARRAY JSON');
-foreach ($constants as $i => $id) {
-    $id = 'CODEBIRD_RETURNFORMAT_' . $id;
-    defined($id) or define($id, $i);
-}
-$constants = array(
-    'CURLE_SSL_CERTPROBLEM' => 58,
-    'CURLE_SSL_CACERT' => 60,
-    'CURLE_SSL_CACERT_BADFILE' => 77,
-    'CURLE_SSL_CRL_BADFILE' => 82,
-    'CURLE_SSL_ISSUER_ERROR' => 83
-);
-foreach ($constants as $id => $i) {
-    defined($id) or define($id, $i);
-}
-unset($constants);
-unset($i);
-unset($id);
-
-/**
- * A Twitter library in PHP.
- *
- * @package codebird
- * @subpackage codebird-php
- */
-class Codebird
-{
-    /**
-     * The current singleton instance
-     */
-    private static $_instance = null;
-
-    /**
-     * The OAuth consumer key of your registered app
-     */
-    protected static $_oauth_consumer_key = null;
-
-    /**
-     * The corresponding consumer secret
-     */
-    protected static $_oauth_consumer_secret = null;
-
-    /**
-     * The app-only bearer token. Used to authorize app-only requests
-     */
-    protected static $_oauth_bearer_token = null;
-
-    /**
-     * The API endpoint to use
-     */
-    protected static $_endpoint = 'https://api.twitter.com/1.1/';
-
-    /**
-     * The API endpoint to use for OAuth requests
-     */
-    protected static $_endpoint_oauth = 'https://api.twitter.com/';
-
-    /**
-     * The Request or access token. Used to sign requests
-     */
-    protected $_oauth_token = null;
-
-    /**
-     * The corresponding request or access token secret
-     */
-    protected $_oauth_token_secret = null;
-
-    /**
-     * The format of data to return from API calls
-     */
-    protected $_return_format = CODEBIRD_RETURNFORMAT_OBJECT;
-
-    /**
-     * The file formats that Twitter accepts as image uploads
-     */
-    protected $_supported_media_files = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG);
-
-    /**
-     * The current Codebird version
-     */
-    protected $_version = '2.4.1';
-
-    /**
-     * Returns singleton class instance
-     * Always use this method unless you're working with multiple authenticated users at once
-     *
-     * @return Codebird The instance
-     */
-    public static function getInstance()
-    {
-        if (self::$_instance == null) {
-            self::$_instance = new self;
-        }
-        return self::$_instance;
-    }
-
-    /**
-     * Sets the OAuth consumer key and secret (App key)
-     *
-     * @param string $key    OAuth consumer key
-     * @param string $secret OAuth consumer secret
-     *
-     * @return void
-     */
-    public static function setConsumerKey($key, $secret)
-    {
-        self::$_oauth_consumer_key    = $key;
-        self::$_oauth_consumer_secret = $secret;
-    }
-
-    /**
-     * Sets the OAuth2 app-only auth bearer token
-     *
-     * @param string $token OAuth2 bearer token
-     *
-     * @return void
-     */
-    public static function setBearerToken($token)
-    {
-        self::$_oauth_bearer_token = $token;
-    }
-
-    /**
-     * Gets the current Codebird version
-     *
-     * @return string The version number
-     */
-    public function getVersion()
-    {
-        return $this->_version;
-    }
-
-    /**
-     * Sets the OAuth request or access token and secret (User key)
-     *
-     * @param string $token  OAuth request or access token
-     * @param string $secret OAuth request or access token secret
-     *
-     * @return void
-     */
-    public function setToken($token, $secret)
-    {
-        $this->_oauth_token        = $token;
-        $this->_oauth_token_secret = $secret;
-    }
-
-    /**
-     * Sets the format for API replies
-     *
-     * @param int $return_format One of these:
-     *                           CODEBIRD_RETURNFORMAT_OBJECT (default)
-     *                           CODEBIRD_RETURNFORMAT_ARRAY
-     *
-     * @return void
-     */
-    public function setReturnFormat($return_format)
-    {
-        $this->_return_format = $return_format;
-    }
-
-    /**
-     * Main API handler working on any requests you issue
-     *
-     * @param string $fn    The member function you called
-     * @param array $params The parameters you sent along
-     *
-     * @return mixed The API reply encoded in the set return_format
-     */
-
-    public function __call($fn, $params)
-    {
-        // parse parameters
-        $apiparams = array();
-        if (count($params) > 0) {
-            if (is_array($params[0])) {
-                $apiparams = $params[0];
-            } else {
-                parse_str($params[0], $apiparams);
-                // remove auto-added slashes if on magic quotes steroids
-                if (get_magic_quotes_gpc()) {
-                    foreach($apiparams as $key => $value) {
-                        if (is_array($value)) {
-                            $apiparams[$key] = array_map('stripslashes', $value);
-                        } else {
-                            $apiparams[$key] = stripslashes($value);
-                        }
-                    }
-                }
-            }
-        }
-
-        // stringify null and boolean parameters
-        foreach ($apiparams as $key => $value) {
-            if (! is_scalar($value)) {
-                continue;
-            }
-            if (is_null($value)) {
-                $apiparams[$key] = 'null';
-            } elseif (is_bool($value)) {
-                $apiparams[$key] = $value ? 'true' : 'false';
-            }
-        }
-
-        $app_only_auth = false;
-        if (count($params) > 1) {
-            $app_only_auth = !! $params[1];
-        }
-
-        // map function name to API method
-        $method = '';
-
-        // replace _ by /
-        $path = explode('_', $fn);
-        for ($i = 0; $i < count($path); $i++) {
-            if ($i > 0) {
-                $method .= '/';
-            }
-            $method .= $path[$i];
-        }
-        // undo replacement for URL parameters
-        $url_parameters_with_underscore = array('screen_name');
-        foreach ($url_parameters_with_underscore as $param) {
-            $param = strtoupper($param);
-            $replacement_was = str_replace('_', '/', $param);
-            $method = str_replace($replacement_was, $param, $method);
-        }
-
-        // replace AA by URL parameters
-        $method_template = $method;
-        $match   = array();
-        if (preg_match('/[A-Z_]{2,}/', $method, $match)) {
-            foreach ($match as $param) {
-                $param_l = strtolower($param);
-                $method_template = str_replace($param, ':' . $param_l, $method_template);
-                if (!isset($apiparams[$param_l])) {
-                    for ($i = 0; $i < 26; $i++) {
-                        $method_template = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method_template);
-                    }
-                    throw new \Exception(
-                        'To call the templated method "' . $method_template
-                        . '", specify the parameter value for "' . $param_l . '".'
-                    );
-                }
-                $method  = str_replace($param, $apiparams[$param_l], $method);
-                unset($apiparams[$param_l]);
-            }
-        }
-
-        // replace A-Z by _a-z
-        for ($i = 0; $i < 26; $i++) {
-            $method  = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method);
-            $method_template = str_replace(chr(65 + $i), '_' . chr(97 + $i), $method_template);
-        }
-
-        $httpmethod = $this->_detectMethod($method_template, $apiparams);
-        $multipart  = $this->_detectMultipart($method_template);
-
-        return $this->_callApi(
-            $httpmethod,
-            $method,
-            $method_template,
-            $apiparams,
-            $multipart,
-            $app_only_auth
-        );
-    }
-
-    /**
-     * Uncommon API methods
-     */
-
-    /**
-     * Gets the OAuth authenticate URL for the current request token
-     *
-     * @return string The OAuth authenticate URL
-     */
-    public function oauth_authenticate($force_login = NULL, $screen_name = NULL)
-    {
-        if ($this->_oauth_token == null) {
-            throw new \Exception('To get the authenticate URL, the OAuth token must be set.');
-        }
-        $url = self::$_endpoint_oauth . 'oauth/authenticate?oauth_token=' . $this->_url($this->_oauth_token);
-        if ($force_login) {
-            $url .= "&force_login=1";
-        }
-        if ($screen_name) {
-            $url .= "&screen_name=" . $screen_name;
-        }
-        return $url;
-    }
-
-    /**
-     * Gets the OAuth authorize URL for the current request token
-     *
-     * @return string The OAuth authorize URL
-     */
-    public function oauth_authorize($force_login = NULL, $screen_name = NULL)
-    {
-        if ($this->_oauth_token == null) {
-            throw new \Exception('To get the authorize URL, the OAuth token must be set.');
-        }
-        $url = self::$_endpoint_oauth . 'oauth/authorize?oauth_token=' . $this->_url($this->_oauth_token);
-        if ($force_login) {
-            $url .= "&force_login=1";
-        }
-        if ($screen_name) {
-            $url .= "&screen_name=" . $screen_name;
-        }
-        return $url;
-    }
-
-    /**
-     * Gets the OAuth bearer token
-     *
-     * @return string The OAuth bearer token
-     */
-
-    public function oauth2_token()
-    {
-        if (! function_exists('curl_init')) {
-            throw new \Exception('To make API requests, the PHP curl extension must be available.');
-        }
-        if (self::$_oauth_consumer_key == null) {
-            throw new \Exception('To obtain a bearer token, the consumer key must be set.');
-        }
-        $ch  = false;
-        $post_fields = array(
-            'grant_type' => 'client_credentials'
-        );
-        $url = self::$_endpoint_oauth . 'oauth2/token';
-        $ch = curl_init($url);
-        curl_setopt($ch, CURLOPT_POST, 1);
-        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
-        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
-        curl_setopt($ch, CURLOPT_HEADER, 1);
-        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
-        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
-        curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem');
-
-        curl_setopt($ch, CURLOPT_USERPWD, self::$_oauth_consumer_key . ':' . self::$_oauth_consumer_secret);
-        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
-            'Expect:'
-        ));
-        $reply = curl_exec($ch);
-
-        // certificate validation results
-        $validation_result = curl_errno($ch);
-        if (in_array(
-                $validation_result,
-                array(
-                    CURLE_SSL_CERTPROBLEM,
-                    CURLE_SSL_CACERT,
-                    CURLE_SSL_CACERT_BADFILE,
-                    CURLE_SSL_CRL_BADFILE,
-                    CURLE_SSL_ISSUER_ERROR
-                )
-            )
-        ) {
-            throw new \Exception('Error ' . $validation_result . ' while validating the Twitter API certificate.');
-        }
-
-        $httpstatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
-        $reply = $this->_parseApiReply('oauth2/token', $reply);
-        switch ($this->_return_format) {
-            case CODEBIRD_RETURNFORMAT_ARRAY:
-                $reply['httpstatus'] = $httpstatus;
-                if ($httpstatus == 200) {
-                    self::setBearerToken($reply['access_token']);
-                }
-                break;
-            case CODEBIRD_RETURNFORMAT_JSON:
-                if ($httpstatus == 200) {
-                    $parsed = json_decode($reply);
-                    self::setBearerToken($parsed->access_token);
-                }
-                break;
-            case CODEBIRD_RETURNFORMAT_OBJECT:
-                $reply->httpstatus = $httpstatus;
-                if ($httpstatus == 200) {
-                    self::setBearerToken($reply->access_token);
-                }
-                break;
-        }
-        return $reply;
-    }
-
-    /**
-     * Signing helpers
-     */
-
-    /**
-     * URL-encodes the given data
-     *
-     * @param mixed $data
-     *
-     * @return mixed The encoded data
-     */
-    private function _url($data)
-    {
-        if (is_array($data)) {
-            return array_map(array(
-                $this,
-                '_url'
-            ), $data);
-        } elseif (is_scalar($data)) {
-            return str_replace(array(
-                '+',
-                '!',
-                '*',
-                "'",
-                '(',
-                ')'
-            ), array(
-                ' ',
-                '%21',
-                '%2A',
-                '%27',
-                '%28',
-                '%29'
-            ), rawurlencode($data));
-        } else {
-            return '';
-        }
-    }
-
-    /**
-     * Gets the base64-encoded SHA1 hash for the given data
-     *
-     * @param string $data The data to calculate the hash from
-     *
-     * @return string The hash
-     */
-    private function _sha1($data)
-    {
-        if (self::$_oauth_consumer_secret == null) {
-            throw new \Exception('To generate a hash, the consumer secret must be set.');
-        }
-        if (!function_exists('hash_hmac')) {
-            throw new \Exception('To generate a hash, the PHP hash extension must be available.');
-        }
-        return base64_encode(hash_hmac('sha1', $data, self::$_oauth_consumer_secret . '&'
-            . ($this->_oauth_token_secret != null ? $this->_oauth_token_secret : ''), true));
-    }
-
-    /**
-     * Generates a (hopefully) unique random string
-     *
-     * @param int optional $length The length of the string to generate
-     *
-     * @return string The random string
-     */
-    protected function _nonce($length = 8)
-    {
-        if ($length < 1) {
-            throw new \Exception('Invalid nonce length.');
-        }
-        return substr(md5(microtime(true)), 0, $length);
-    }
-
-    /**
-     * Generates an OAuth signature
-     *
-     * @param string          $httpmethod Usually either 'GET' or 'POST' or 'DELETE'
-     * @param string          $method     The API method to call
-     * @param array  optional $params     The API call parameters, associative
-     *
-     * @return string Authorization HTTP header
-     */
-    protected function _sign($httpmethod, $method, $params = array())
-    {
-        if (self::$_oauth_consumer_key == null) {
-            throw new \Exception('To generate a signature, the consumer key must be set.');
-        }
-        $sign_params      = array(
-            'consumer_key' => self::$_oauth_consumer_key,
-            'version' => '1.0',
-            'timestamp' => time(),
-            'nonce' => $this->_nonce(),
-            'signature_method' => 'HMAC-SHA1'
-        );
-        $sign_base_params = array();
-        foreach ($sign_params as $key => $value) {
-            $sign_base_params['oauth_' . $key] = $this->_url($value);
-        }
-        if ($this->_oauth_token != null) {
-            $sign_base_params['oauth_token'] = $this->_url($this->_oauth_token);
-        }
-        $oauth_params = $sign_base_params;
-        foreach ($params as $key => $value) {
-            $sign_base_params[$key] = $this->_url($value);
-        }
-        ksort($sign_base_params);
-        $sign_base_string = '';
-        foreach ($sign_base_params as $key => $value) {
-            $sign_base_string .= $key . '=' . $value . '&';
-        }
-        $sign_base_string = substr($sign_base_string, 0, -1);
-        $signature        = $this->_sha1($httpmethod . '&' . $this->_url($method) . '&' . $this->_url($sign_base_string));
-
-        $params = array_merge($oauth_params, array(
-            'oauth_signature' => $signature
-        ));
-        ksort($params);
-        $authorization = 'Authorization: OAuth ';
-        foreach ($params as $key => $value) {
-            $authorization .= $key . '="' . $this->_url($value) . '", ';
-        }
-        return substr($authorization, 0, -2);
-    }
-
-    /**
-     * Detects HTTP method to use for API call
-     *
-     * @param string $method The API method to call
-     * @param array  $params The parameters to send along
-     *
-     * @return string The HTTP method that should be used
-     */
-    protected function _detectMethod($method, $params)
-    {
-        // multi-HTTP method endpoints
-        switch($method) {
-            case 'account/settings':
-                $method = count($params) > 0 ? $method . '__post' : $method;
-                break;
-        }
-
-        $httpmethods         = array();
-        $httpmethods['GET']  = array(
-            // Timelines
-            'statuses/mentions_timeline',
-            'statuses/user_timeline',
-            'statuses/home_timeline',
-            'statuses/retweets_of_me',
-
-            // Tweets
-            'statuses/retweets/:id',
-            'statuses/show/:id',
-            'statuses/oembed',
-
-            // Search
-            'search/tweets',
-
-            // Direct Messages
-            'direct_messages',
-            'direct_messages/sent',
-            'direct_messages/show',
-
-            // Friends & Followers
-            'friendships/no_retweets/ids',
-            'friends/ids',
-            'followers/ids',
-            'friendships/lookup',
-            'friendships/incoming',
-            'friendships/outgoing',
-            'friendships/show',
-            'friends/list',
-            'followers/list',
-
-            // Users
-            'account/settings',
-            'account/verify_credentials',
-            'blocks/list',
-            'blocks/ids',
-            'users/lookup',
-            'users/show',
-            'users/search',
-            'users/contributees',
-            'users/contributors',
-            'users/profile_banner',
-
-            // Suggested Users
-            'users/suggestions/:slug',
-            'users/suggestions',
-            'users/suggestions/:slug/members',
-
-            // Favorites
-            'favorites/list',
-
-            // Lists
-            'lists/list',
-            'lists/statuses',
-            'lists/memberships',
-            'lists/subscribers',
-            'lists/subscribers/show',
-            'lists/members/show',
-            'lists/members',
-            'lists/show',
-            'lists/subscriptions',
-
-            // Saved searches
-            'saved_searches/list',
-            'saved_searches/show/:id',
-
-            // Places & Geo
-            'geo/id/:place_id',
-            'geo/reverse_geocode',
-            'geo/search',
-            'geo/similar_places',
-
-            // Trends
-            'trends/place',
-            'trends/available',
-            'trends/closest',
-
-            // OAuth
-            'oauth/authenticate',
-            'oauth/authorize',
-
-            // Help
-            'help/configuration',
-            'help/languages',
-            'help/privacy',
-            'help/tos',
-            'application/rate_limit_status'
-        );
-        $httpmethods['POST'] = array(
-            // Tweets
-            'statuses/destroy/:id',
-            'statuses/update',
-            'statuses/retweet/:id',
-            'statuses/update_with_media',
-
-            // Direct Messages
-            'direct_messages/destroy',
-            'direct_messages/new',
-
-            // Friends & Followers
-            'friendships/create',
-            'friendships/destroy',
-            'friendships/update',
-
-            // Users
-            'account/settings__post',
-            'account/update_delivery_device',
-            'account/update_profile',
-            'account/update_profile_background_image',
-            'account/update_profile_colors',
-            'account/update_profile_image',
-            'blocks/create',
-            'blocks/destroy',
-            'account/update_profile_banner',
-            'account/remove_profile_banner',
-
-            // Favorites
-            'favorites/destroy',
-            'favorites/create',
-
-            // Lists
-            'lists/members/destroy',
-            'lists/subscribers/create',
-            'lists/subscribers/destroy',
-            'lists/members/create_all',
-            'lists/members/create',
-            'lists/destroy',
-            'lists/update',
-            'lists/create',
-            'lists/members/destroy_all',
-
-            // Saved Searches
-            'saved_searches/create',
-            'saved_searches/destroy/:id',
-
-            // Places & Geo
-            'geo/place',
-
-            // Spam Reporting
-            'users/report_spam',
-
-            // OAuth
-            'oauth/access_token',
-            'oauth/request_token',
-            'oauth2/token',
-            'oauth2/invalidate_token'
-        );
-        foreach ($httpmethods as $httpmethod => $methods) {
-            if (in_array($method, $methods)) {
-                return $httpmethod;
-            }
-        }
-        throw new \Exception('Can\'t find HTTP method to use for "' . $method . '".');
-    }
-
-    /**
-     * Detects if API call should use multipart/form-data
-     *
-     * @param string $method The API method to call
-     *
-     * @return bool Whether the method should be sent as multipart
-     */
-    protected function _detectMultipart($method)
-    {
-        $multiparts = array(
-            // Tweets
-            'statuses/update_with_media',
-
-            // Users
-            'account/update_profile_background_image',
-            'account/update_profile_image',
-            'account/update_profile_banner'
-        );
-        return in_array($method, $multiparts);
-    }
-
-    /**
-     * Detect filenames in upload parameters,
-     * build multipart request from upload params
-     *
-     * @param string $method  The API method to call
-     * @param array  $params  The parameters to send along
-     *
-     * @return void
-     */
-    protected function _buildMultipart($method, $params)
-    {
-        // well, files will only work in multipart methods
-        if (! $this->_detectMultipart($method)) {
-            return;
-        }
-
-        // only check specific parameters
-        $possible_files = array(
-            // Tweets
-            'statuses/update_with_media' => 'media[]',
-            // Accounts
-            'account/update_profile_background_image' => 'image',
-            'account/update_profile_image' => 'image',
-            'account/update_profile_banner' => 'banner'
-        );
-        // method might have files?
-        if (! in_array($method, array_keys($possible_files))) {
-            return;
-        }
-
-        $possible_files = explode(' ', $possible_files[$method]);
-
-        $multipart_border = '--------------------' . $this->_nonce();
-        $multipart_request = '';
-
-        foreach ($params as $key => $value) {
-            // is it an array?
-            if (is_array($value)) {
-                throw new \Exception('Using URL-encoded parameters is not supported for uploading media.');
-                continue;
-            }
-            $multipart_request .=
-                '--' . $multipart_border . "\r\n"
-                . 'Content-Disposition: form-data; name="' . $key . '"';
-
-            // check for filenames
-            if (in_array($key, $possible_files)) {
-                if (// is it a file, a readable one?
-                    @file_exists($value)
-                    && @is_readable($value)
-
-                    // is it a valid image?
-                    && $data = @getimagesize($value)
-                ) {
-                    if (// is it a supported image format?
-                        in_array($data[2], $this->_supported_media_files)
-                    ) {
-                        // try to read the file
-                        ob_start();
-                        readfile($value);
-                        $data = ob_get_contents();
-                        ob_end_clean();
-                        if (strlen($data) == 0) {
-                            continue;
-                        }
-                        $value = $data;
-                    }
-                }
-
-                /*
-                $multipart_request .=
-                    "\r\nContent-Transfer-Encoding: base64";
-                $value = base64_encode($value);
-                */
-            }
-
-            $multipart_request .=
-                "\r\n\r\n" . $value . "\r\n";
-        }
-        $multipart_request .= '--' . $multipart_border . '--';
-
-        return $multipart_request;
-    }
-
-
-    /**
-     * Builds the complete API endpoint url
-     *
-     * @param string $method           The API method to call
-     * @param string $method_template  The API method template to call
-     *
-     * @return string The URL to send the request to
-     */
-    protected function _getEndpoint($method, $method_template)
-    {
-        if (substr($method, 0, 5) == 'oauth') {
-            $url = self::$_endpoint_oauth . $method;
-        } else {
-            $url = self::$_endpoint . $method . '.json';
-        }
-        return $url;
-    }
-
-    /**
-     * Calls the API using cURL
-     *
-     * @param string          $httpmethod      The HTTP method to use for making the request
-     * @param string          $method          The API method to call
-     * @param string          $method_template The templated API method to call
-     * @param array  optional $params          The parameters to send along
-     * @param bool   optional $multipart       Whether to use multipart/form-data
-     * @param bool   optional $app_only_auth   Whether to use app-only bearer authentication
-     *
-     * @return mixed The API reply, encoded in the set return_format
-     */
-
-    protected function _callApi($httpmethod, $method, $method_template, $params = array(), $multipart = false, $app_only_auth = false)
-    {
-        if (! function_exists('curl_init')) {
-            throw new \Exception('To make API requests, the PHP curl extension must be available.');
-        }
-        $url = $this->_getEndpoint($method, $method_template);
-        $ch  = false;
-        if ($httpmethod == 'GET') {
-            $url_with_params = $url;
-            if (count($params) > 0) {
-                $url_with_params .= '?' . http_build_query($params);
-            }
-            $authorization = $this->_sign($httpmethod, $url, $params);
-            $ch = curl_init($url_with_params);
-        } else {
-            if ($multipart) {
-                $authorization = $this->_sign($httpmethod, $url, array());
-                $params        = $this->_buildMultipart($method_template, $params);
-            } else {
-                $authorization = $this->_sign($httpmethod, $url, $params);
-                $params        = http_build_query($params);
-            }
-            $ch = curl_init($url);
-            curl_setopt($ch, CURLOPT_POST, 1);
-            curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
-        }
-        if ($app_only_auth) {
-            if (self::$_oauth_consumer_key == null) {
-                throw new \Exception('To make an app-only auth API request, the consumer key must be set.');
-            }
-            // automatically fetch bearer token, if necessary
-            if (self::$_oauth_bearer_token == null) {
-                $this->oauth2_token();
-            }
-            $authorization = 'Authorization: Bearer ' . self::$_oauth_bearer_token;
-        }
-        $request_headers = array();
-        if (isset($authorization)) {
-            $request_headers[] = $authorization;
-            $request_headers[] = 'Expect:';
-        }
-        if ($multipart) {
-            $first_newline      = strpos($params, "\r\n");
-            $multipart_boundary = substr($params, 2, $first_newline - 2);
-            $request_headers[]  = 'Content-Length: ' . strlen($params);
-            $request_headers[]  = 'Content-Type: multipart/form-data; boundary='
-                . $multipart_boundary;
-        }
-
-        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
-        curl_setopt($ch, CURLOPT_HEADER, 1);
-        curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
-        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
-        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
-        curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem');
-
-        $reply = curl_exec($ch);
-
-        // certificate validation results
-        $validation_result = curl_errno($ch);
-        if (in_array(
-                $validation_result,
-                array(
-                    CURLE_SSL_CERTPROBLEM,
-                    CURLE_SSL_CACERT,
-                    CURLE_SSL_CACERT_BADFILE,
-                    CURLE_SSL_CRL_BADFILE,
-                    CURLE_SSL_ISSUER_ERROR
-                )
-            )
-        ) {
-            throw new \Exception('Error ' . $validation_result . ' while validating the Twitter API certificate.');
-        }
-
-        $httpstatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
-        $reply = $this->_parseApiReply($method_template, $reply);
-        if ($this->_return_format == CODEBIRD_RETURNFORMAT_OBJECT) {
-            $reply->httpstatus = $httpstatus;
-        } elseif ($this->_return_format == CODEBIRD_RETURNFORMAT_ARRAY) {
-            $reply['httpstatus'] = $httpstatus;
-        }
-        return $reply;
-    }
-
-    /**
-     * Parses the API reply to encode it in the set return_format
-     *
-     * @param string $method The method that has been called
-     * @param string $reply  The actual reply, JSON-encoded or URL-encoded
-     *
-     * @return array|object The parsed reply
-     */
-    protected function _parseApiReply($method, $reply)
-    {
-        // split headers and body
-        $headers = array();
-        $reply = explode("\r\n\r\n", $reply, 4);
-
-        // check if using proxy
-        if (substr($reply[0], 0, 35) === 'HTTP/1.1 200 Connection Established') {
-            array_shift($reply);
-        } elseif (count($reply) > 2) {
-            $headers = array_shift($reply);
-            $reply = array(
-                $headers,
-                implode("\r\n", $reply)
-            );
-        }
-
-        $headers_array = explode("\r\n", $reply[0]);
-        foreach ($headers_array as $header) {
-            $header_array = explode(': ', $header, 2);
-            $key = $header_array[0];
-            $value = '';
-            if (count($header_array) > 1) {
-                $value = $header_array[1];
-            }
-            $headers[$key] = $value;
-        }
-        if (count($reply) > 1) {
-            $reply = $reply[1];
-        } else {
-            $reply = '';
-        }
-
-        $need_array = $this->_return_format == CODEBIRD_RETURNFORMAT_ARRAY;
-        if ($reply == '[]') {
-            switch ($this->_return_format) {
-                case CODEBIRD_RETURNFORMAT_ARRAY:
-                    return array();
-                case CODEBIRD_RETURNFORMAT_JSON:
-                    return '{}';
-                case CODEBIRD_RETURNFORMAT_OBJECT:
-                    return new \stdClass;
-            }
-        }
-        $parsed = array();
-        if (! $parsed = json_decode($reply, $need_array)) {
-            if ($reply) {
-                if (stripos($reply, '<' . '?xml version="1.0" encoding="UTF-8"?' . '>') === 0) {
-                    // we received XML...
-                    // since this only happens for errors,
-                    // don't perform a full decoding
-                    preg_match('/<request>(.*)<\/request>/', $reply, $request);
-                    preg_match('/<error>(.*)<\/error>/', $reply, $error);
-                    $parsed['request'] = htmlspecialchars_decode($request[1]);
-                    $parsed['error'] = htmlspecialchars_decode($error[1]);
-                } else {
-                    // assume query format
-                    $reply = explode('&', $reply);
-                    foreach ($reply as $element) {
-                        if (stristr($element, '=')) {
-                            list($key, $value) = explode('=', $element);
-                            $parsed[$key] = $value;
-                        } else {
-                            $parsed['message'] = $element;
-                        }
-                    }
-                }
-            }
-            $reply = json_encode($parsed);
-        }
-        switch ($this->_return_format) {
-            case CODEBIRD_RETURNFORMAT_ARRAY:
-                return $parsed;
-            case CODEBIRD_RETURNFORMAT_JSON:
-                return $reply;
-            case CODEBIRD_RETURNFORMAT_OBJECT:
-                return (object) $parsed;
-        }
-        return $parsed;
-    }
-}
-
-?>
diff --git a/twitter/composer.json b/twitter/composer.json
new file mode 100644 (file)
index 0000000..efe4ffa
--- /dev/null
@@ -0,0 +1,28 @@
+{
+    "name": "friendica-addons/twitter",
+    "description": "Twitter Connector addon for Friendica",
+    "type": "friendica-addon",
+       "authors": [
+        {
+            "name": "Tobias Diekershoff",
+            "homepage": "https://f.diekershoff.de/profile/tobias",
+            "role": "Developer"
+        },
+        {
+            "name": "Michael Vogel",
+            "homepage": "https://pirati.ca/profile/heluecht",
+            "role": "Developer"
+        },
+        {
+            "name": "Hypolite Petovan",
+            "email": "mrpetovan@gmail.com",
+            "homepage": "https://friendica.mrpetovan.com/profile/hypolite",
+            "role": "Developer"
+        }
+    ],
+    "require": {
+        "abraham/twitteroauth": "^0.7.4"
+    },
+    "license": "3-clause BSD license",
+    "minimum-stability": "stable"
+}
diff --git a/twitter/composer.lock b/twitter/composer.lock
new file mode 100644 (file)
index 0000000..419ff4c
--- /dev/null
@@ -0,0 +1,72 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "341c2ca2f25177375c65577f7e5d7369",
+    "packages": [
+        {
+            "name": "abraham/twitteroauth",
+            "version": "0.7.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/abraham/twitteroauth.git",
+                "reference": "c6f9e692552dd037b2324ed0dfa28a4e60875acf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/abraham/twitteroauth/zipball/c6f9e692552dd037b2324ed0dfa28a4e60875acf",
+                "reference": "c6f9e692552dd037b2324ed0dfa28a4e60875acf",
+                "shasum": ""
+            },
+            "require": {
+                "ext-curl": "*",
+                "php": "^5.6 || ^7.0"
+            },
+            "require-dev": {
+                "phpmd/phpmd": "~2.6",
+                "phpunit/phpunit": "~5.7",
+                "squizlabs/php_codesniffer": "~3.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Abraham\\TwitterOAuth\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Abraham Williams",
+                    "email": "abraham@abrah.am",
+                    "homepage": "https://abrah.am",
+                    "role": "Developer"
+                }
+            ],
+            "description": "The most popular PHP library for use with the Twitter OAuth REST API.",
+            "homepage": "https://twitteroauth.com",
+            "keywords": [
+                "Twitter API",
+                "Twitter oAuth",
+                "api",
+                "oauth",
+                "rest",
+                "social",
+                "twitter"
+            ],
+            "time": "2017-06-30T22:02:01+00:00"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": [],
+    "platform-dev": []
+}
index fa058ba46ff5bdbe5721e44aabcc4a88a732e506..f6d08a446e98f8362afc51f9cc36c1b12cf9c595 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
+"POT-Creation-Date: 2018-02-08 07:07+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,104 +17,106 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: twitter.php:77
+#: twitter.php:193
 msgid "Post to Twitter"
 msgstr ""
 
-#: twitter.php:129
+#: twitter.php:234
+msgid ""
+"You submitted an empty PIN, please Sign In with Twitter again to get a new "
+"one."
+msgstr ""
+
+#: twitter.php:261
 msgid "Twitter settings updated."
 msgstr ""
 
-#: twitter.php:157
-msgid "Twitter Posting Settings"
+#: twitter.php:291 twitter.php:295
+msgid "Twitter Import/Export/Mirror"
 msgstr ""
 
-#: twitter.php:164
+#: twitter.php:302
 msgid ""
 "No consumer key pair for Twitter found. Please contact your site "
 "administrator."
 msgstr ""
 
-#: twitter.php:183
+#: twitter.php:314
 msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
 "yet connected your account to your Twitter account. To do so click the "
 "button below to get a PIN from Twitter which you have to copy into the input "
 "box below and submit the form. Only your <strong>public</strong> posts will "
 "be posted to Twitter."
 msgstr ""
 
-#: twitter.php:184
+#: twitter.php:315
 msgid "Log in with Twitter"
 msgstr ""
 
-#: twitter.php:186
+#: twitter.php:317
 msgid "Copy the PIN from Twitter here"
 msgstr ""
 
-#: twitter.php:191 twitter.php:229 twitter.php:556
-msgid "Submit"
+#: twitter.php:322 twitter.php:364 twitter.php:642
+msgid "Save Settings"
 msgstr ""
 
-#: twitter.php:200
+#: twitter.php:334
 msgid "Currently connected to: "
 msgstr ""
 
-#: twitter.php:201
+#: twitter.php:335
+msgid "Disconnect"
+msgstr ""
+
+#: twitter.php:345
+msgid "Allow posting to Twitter"
+msgstr ""
+
+#: twitter.php:345
 msgid ""
 "If enabled all your <strong>public</strong> postings can be posted to the "
 "associated Twitter account. You can choose to do so by default (here) or for "
 "every posting separately in the posting options when writing the entry."
 msgstr ""
 
-#: twitter.php:203
+#: twitter.php:348
 msgid ""
-"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
+"<strong>Note</strong>: Due to your privacy settings (<em>Hide your profile "
 "details from unknown viewers?</em>) the link potentially included in public "
 "postings relayed to Twitter will lead the visitor to a blank page informing "
 "the visitor that the access to your profile has been restricted."
 msgstr ""
 
-#: twitter.php:206
-msgid "Allow posting to Twitter"
-msgstr ""
-
-#: twitter.php:209
+#: twitter.php:351
 msgid "Send public postings to Twitter by default"
 msgstr ""
 
-#: twitter.php:213
-msgid "Mirror all posts from twitter that are no replies or retweets"
+#: twitter.php:354
+msgid "Mirror all posts from twitter that are no replies"
 msgstr ""
 
-#: twitter.php:217
-msgid "Shortening method that optimizes the tweet"
+#: twitter.php:357
+msgid "Import the remote timeline"
 msgstr ""
 
-#: twitter.php:221
-msgid "Send linked #-tags and @-names to Twitter"
+#: twitter.php:360
+msgid "Automatically create contacts"
 msgstr ""
 
-#: twitter.php:226
-msgid "Clear OAuth configuration"
+#: twitter.php:619
+msgid "Twitter post failed. Queued for retry."
 msgstr ""
 
-#: twitter.php:550
+#: twitter.php:634
 msgid "Settings updated."
 msgstr ""
 
-#: twitter.php:558
+#: twitter.php:644
 msgid "Consumer key"
 msgstr ""
 
-#: twitter.php:559
+#: twitter.php:645
 msgid "Consumer secret"
 msgstr ""
-
-#: twitter.php:560
-msgid "Name of the Twitter Application"
-msgstr ""
-
-#: twitter.php:560
-msgid "set this to avoid mirroring postings from ~friendica back to ~friendica"
-msgstr ""
index 203c9a1f2ed460bb50e2b7e5aedbdf5d1bfd3010..bc53d4c804ad3365bcd58f2d4da475cf517a1f34 100644 (file)
@@ -4,7 +4,7 @@ $a->strings["Post to Twitter"] = "Publica-ho al Twitter";
 $a->strings["Twitter settings updated."] = "La configuració de Twitter actualitzada.";\r
 $a->strings["Twitter Posting Settings"] = "Configuració d'Enviaments per a Twitter";\r
 $a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "No s'ha pogut emparellar cap clau \"consumer key\" per a Twitter. Si us plau, poseu-vos en contacte amb l'administrador del lloc.";\r
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "En aquesta instància Friendica el plugin Twitter va ser habilitat, però encara no ha connectat el compte al seu compte de Twitter. Per a això feu clic al botó de sota per obtenir un PIN de Twitter que ha de copiar a la casella de sota i enviar el formulari. Només els missatges <strong> públics </strong> es publicaran a Twitter.";\r
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "En aquesta instància Friendica el addon Twitter va ser habilitat, però encara no ha connectat el compte al seu compte de Twitter. Per a això feu clic al botó de sota per obtenir un PIN de Twitter que ha de copiar a la casella de sota i enviar el formulari. Només els missatges <strong> públics </strong> es publicaran a Twitter.";\r
 $a->strings["Log in with Twitter"] = "Accedeixi com en  Twitter";\r
 $a->strings["Copy the PIN from Twitter here"] = "Copieu el codi PIN de Twitter aquí";\r
 $a->strings["Submit"] = "Enviar";\r
index f893d731414f6e653e0afc7dcd554328cddda8b5..5e35bae6752c0bccc8ad68cfac80948c6b6f77d1 100644 (file)
@@ -39,12 +39,12 @@ msgstr "Nenalezen žádný spotřebitelský páru klíčů pro Twitter. Obraťte
 
 #: twitter.php:264
 msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
 "yet connected your account to your Twitter account. To do so click the "
 "button below to get a PIN from Twitter which you have to copy into the input"
 " box below and submit the form. Only your <strong>public</strong> posts will"
 " be posted to Twitter."
-msgstr "Na této Friendica instanci je sice povolen Twitter plugin, ale vy jste si ještě nenastavili svůj Twitter účet. Svůj účet si můžete nastavit kliknutím na tlačítko níže k získání PINu z Vašeho Twitteru, který si zkopírujte do níže uvedeného vstupního pole a odešlete formulář. Pouze vaše <strong>veřejné</strong> příspěvky budou zaslány na Twitter."
+msgstr "Na této Friendica instanci je sice povolen Twitter addon, ale vy jste si ještě nenastavili svůj Twitter účet. Svůj účet si můžete nastavit kliknutím na tlačítko níže k získání PINu z Vašeho Twitteru, který si zkopírujte do níže uvedeného vstupního pole a odešlete formulář. Pouze vaše <strong>veřejné</strong> příspěvky budou zaslány na Twitter."
 
 #: twitter.php:265
 msgid "Log in with Twitter"
index 8de4b13001a14a0cc4362c00f90b21412c71561a..6561b6b811021aef9db7930043dba61c942e1adf 100644 (file)
@@ -9,7 +9,7 @@ $a->strings["Post to Twitter"] = "Poslat příspěvek na Twitter";
 $a->strings["Twitter settings updated."] = "Nastavení Twitteru aktualizováno.";
 $a->strings["Twitter Import/Export/Mirror"] = "Twitter Import/Export/Zrcadlení";
 $a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Nenalezen žádný spotřebitelský páru klíčů pro Twitter. Obraťte se na administrátora webu.";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Na této Friendica instanci je sice povolen Twitter plugin, ale vy jste si ještě nenastavili svůj Twitter účet. Svůj účet si můžete nastavit kliknutím na tlačítko níže k získání PINu z Vašeho Twitteru, který si zkopírujte do níže uvedeného vstupního pole a odešlete formulář. Pouze vaše <strong>veřejné</strong> příspěvky budou zaslány na Twitter.";
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Na této Friendica instanci je sice povolen Twitter addon, ale vy jste si ještě nenastavili svůj Twitter účet. Svůj účet si můžete nastavit kliknutím na tlačítko níže k získání PINu z Vašeho Twitteru, který si zkopírujte do níže uvedeného vstupního pole a odešlete formulář. Pouze vaše <strong>veřejné</strong> příspěvky budou zaslány na Twitter.";
 $a->strings["Log in with Twitter"] = "Přihlásit se s Twitter";
 $a->strings["Copy the PIN from Twitter here"] = "Zkopírujte sem PIN z Twitteru";
 $a->strings["Save Settings"] = "Uložit Nastavení";
index 5ec80d6418d8411e4b71c7fa02742cca1d523c40..cb26733b231bfa4c1bfda1e2d83f59ef6c1bb3d0 100644 (file)
 # 
 # 
 # Translators:
-# bavatar <tobias.diekershoff@gmx.net>, 2014
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2014-2015
+# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-06-23 14:45+0200\n"
-"PO-Revision-Date: 2014-09-06 11:55+0000\n"
-"Last-Translator: bavatar <tobias.diekershoff@gmx.net>\n"
-"Language-Team: German (http://www.transifex.com/projects/p/friendica/language/de/)\n"
+"POT-Creation-Date: 2018-02-08 07:07+0100\n"
+"PO-Revision-Date: 2018-02-10 17:41+0000\n"
+"Last-Translator: Tobias Diekershoff <tobias.diekershoff@gmx.net>\n"
+"Language-Team: German (http://www.transifex.com/Friendica/friendica/language/de/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: de\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: twitter.php:146
+#: twitter.php:193
 msgid "Post to Twitter"
-msgstr "An Twitter senden"
+msgstr "Auf Twitter veröffentlichen"
 
-#: twitter.php:203
+#: twitter.php:234
+msgid ""
+"You submitted an empty PIN, please Sign In with Twitter again to get a new "
+"one."
+msgstr "Du hast keine PIN übertragen. Bitte melde dich erneut bei Twitter and um eine neue PIN zu erhalten."
+
+#: twitter.php:261
 msgid "Twitter settings updated."
 msgstr "Twitter Einstellungen aktualisiert."
 
-#: twitter.php:233 twitter.php:237
+#: twitter.php:291 twitter.php:295
 msgid "Twitter Import/Export/Mirror"
 msgstr "Twitter Import/Export/Spiegeln"
 
-#: twitter.php:245
+#: twitter.php:302
 msgid ""
 "No consumer key pair for Twitter found. Please contact your site "
 "administrator."
 msgstr "Kein Consumer Schlüsselpaar für Twitter gefunden. Bitte wende dich an den Administrator der Seite."
 
-#: twitter.php:264
+#: twitter.php:314
 msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
 "yet connected your account to your Twitter account. To do so click the "
 "button below to get a PIN from Twitter which you have to copy into the input"
 " box below and submit the form. Only your <strong>public</strong> posts will"
 " be posted to Twitter."
-msgstr "Auf diesem Friendica-Server wurde das Twitter-Plugin aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu auf die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du dann in das Eingabefeld unten einfügst. Denk daran, den Senden-Knopf zu drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter veröffentlicht."
+msgstr "Auf diesem Friendica-Server wurde das Twitter-Addon aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu auf die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du dann in das Eingabefeld unten einfügst. Denk daran, den Senden-Knopf zu drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter veröffentlicht."
 
-#: twitter.php:265
+#: twitter.php:315
 msgid "Log in with Twitter"
 msgstr "bei Twitter anmelden"
 
-#: twitter.php:267
+#: twitter.php:317
 msgid "Copy the PIN from Twitter here"
 msgstr "Kopiere die Twitter-PIN hier her"
 
-#: twitter.php:272 twitter.php:311 twitter.php:569
+#: twitter.php:322 twitter.php:364 twitter.php:642
 msgid "Save Settings"
 msgstr "Einstellungen speichern"
 
-#: twitter.php:281
+#: twitter.php:334
 msgid "Currently connected to: "
 msgstr "Momentan verbunden mit: "
 
-#: twitter.php:282
+#: twitter.php:335
+msgid "Disconnect"
+msgstr "Trennen"
+
+#: twitter.php:345
+msgid "Allow posting to Twitter"
+msgstr "Veröffentlichung bei Twitter erlauben"
+
+#: twitter.php:345
 msgid ""
 "If enabled all your <strong>public</strong> postings can be posted to the "
 "associated Twitter account. You can choose to do so by default (here) or for"
 " every posting separately in the posting options when writing the entry."
 msgstr "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen."
 
-#: twitter.php:284
+#: twitter.php:348
 msgid ""
-"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
+"<strong>Note</strong>: Due to your privacy settings (<em>Hide your profile "
 "details from unknown viewers?</em>) the link potentially included in public "
 "postings relayed to Twitter will lead the visitor to a blank page informing "
 "the visitor that the access to your profile has been restricted."
 msgstr "<strong>Hinweis</strong>: Aufgrund deiner Privatsphären-Einstellungen (<em>Profil-Details vor unbekannten Betrachtern verbergen?</em>) wird der Link, der eventuell an an deinen Twitter Account angehängt wird, um auf den original Artikel zu verweisen, den Betrachter auf eine leere Seite führen, die ihn darüber informiert, dass der Zugriff eingeschränkt wurde."
 
-#: twitter.php:287
-msgid "Allow posting to Twitter"
-msgstr "Veröffentlichung bei Twitter erlauben"
-
-#: twitter.php:290
+#: twitter.php:351
 msgid "Send public postings to Twitter by default"
 msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei Twitter"
 
-#: twitter.php:294
+#: twitter.php:354
 msgid "Mirror all posts from twitter that are no replies"
 msgstr "Spiegle alle Beiträge von Twitter die keine Antworten oder wiederholten Nachrichten sind"
 
-#: twitter.php:299
+#: twitter.php:357
 msgid "Import the remote timeline"
 msgstr "Importiere die entfernte Zeitleiste"
 
-#: twitter.php:303
+#: twitter.php:360
 msgid "Automatically create contacts"
 msgstr "Automatisch Kontakte anlegen"
 
-#: twitter.php:308
-msgid "Clear OAuth configuration"
-msgstr "OAuth Konfiguration löschen"
-
-#: twitter.php:539
+#: twitter.php:619
 msgid "Twitter post failed. Queued for retry."
 msgstr "Twitter post failed. Queued for retry."
 
-#: twitter.php:563
+#: twitter.php:634
 msgid "Settings updated."
 msgstr "Einstellungen aktualisiert."
 
-#: twitter.php:571
+#: twitter.php:644
 msgid "Consumer key"
 msgstr "Consumer Key"
 
-#: twitter.php:572
+#: twitter.php:645
 msgid "Consumer secret"
 msgstr "Consumer Secret"
-
-#: twitter.php:573
-msgid "Name of the Twitter Application"
-msgstr "Name der Twitter Anwendung"
-
-#: twitter.php:573
-msgid ""
-"set this to avoid mirroring postings from ~friendica back to ~friendica"
-msgstr "Setze dies um eine Spiegelung von ~friendica zu ~friendica zu vermeiden"
index 997bf55f87f06b89f72f98a34458c96f2a6ea2e9..e6adf09c0c9b4345183edf3d1a75ac51d833976c 100644 (file)
@@ -5,26 +5,25 @@ function string_plural_select_de($n){
        return ($n != 1);;
 }}
 ;
-$a->strings["Post to Twitter"] = "An Twitter senden";
+$a->strings["Post to Twitter"] = "Auf Twitter veröffentlichen";
+$a->strings["You submitted an empty PIN, please Sign In with Twitter again to get a new one."] = "Du hast keine PIN übertragen. Bitte melde dich erneut bei Twitter and um eine neue PIN zu erhalten.";
 $a->strings["Twitter settings updated."] = "Twitter Einstellungen aktualisiert.";
 $a->strings["Twitter Import/Export/Mirror"] = "Twitter Import/Export/Spiegeln";
 $a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Kein Consumer Schlüsselpaar für Twitter gefunden. Bitte wende dich an den Administrator der Seite.";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Auf diesem Friendica-Server wurde das Twitter-Plugin aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu auf die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du dann in das Eingabefeld unten einfügst. Denk daran, den Senden-Knopf zu drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter veröffentlicht.";
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Auf diesem Friendica-Server wurde das Twitter-Addon aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu auf die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du dann in das Eingabefeld unten einfügst. Denk daran, den Senden-Knopf zu drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter veröffentlicht.";
 $a->strings["Log in with Twitter"] = "bei Twitter anmelden";
 $a->strings["Copy the PIN from Twitter here"] = "Kopiere die Twitter-PIN hier her";
 $a->strings["Save Settings"] = "Einstellungen speichern";
 $a->strings["Currently connected to: "] = "Momentan verbunden mit: ";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen.";
-$a->strings["<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Hinweis</strong>: Aufgrund deiner Privatsphären-Einstellungen (<em>Profil-Details vor unbekannten Betrachtern verbergen?</em>) wird der Link, der eventuell an an deinen Twitter Account angehängt wird, um auf den original Artikel zu verweisen, den Betrachter auf eine leere Seite führen, die ihn darüber informiert, dass der Zugriff eingeschränkt wurde.";
+$a->strings["Disconnect"] = "Trennen";
 $a->strings["Allow posting to Twitter"] = "Veröffentlichung bei Twitter erlauben";
+$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen.";
+$a->strings["<strong>Note</strong>: Due to your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Hinweis</strong>: Aufgrund deiner Privatsphären-Einstellungen (<em>Profil-Details vor unbekannten Betrachtern verbergen?</em>) wird der Link, der eventuell an an deinen Twitter Account angehängt wird, um auf den original Artikel zu verweisen, den Betrachter auf eine leere Seite führen, die ihn darüber informiert, dass der Zugriff eingeschränkt wurde.";
 $a->strings["Send public postings to Twitter by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei Twitter";
 $a->strings["Mirror all posts from twitter that are no replies"] = "Spiegle alle Beiträge von Twitter die keine Antworten oder wiederholten Nachrichten sind";
 $a->strings["Import the remote timeline"] = "Importiere die entfernte Zeitleiste";
 $a->strings["Automatically create contacts"] = "Automatisch Kontakte anlegen";
-$a->strings["Clear OAuth configuration"] = "OAuth Konfiguration löschen";
 $a->strings["Twitter post failed. Queued for retry."] = "Twitter post failed. Queued for retry.";
 $a->strings["Settings updated."] = "Einstellungen aktualisiert.";
 $a->strings["Consumer key"] = "Consumer Key";
 $a->strings["Consumer secret"] = "Consumer Secret";
-$a->strings["Name of the Twitter Application"] = "Name der Twitter Anwendung";
-$a->strings["set this to avoid mirroring postings from ~friendica back to ~friendica"] = "Setze dies um eine Spiegelung von ~friendica zu ~friendica zu vermeiden";
index cce714e7916cf0ee70decc7730dd70a405bc2618..0dbedd82ce4bb1011b8754498e2a166684c05f92 100644 (file)
@@ -4,7 +4,7 @@ $a->strings["Post to Twitter"] = "Afiŝi ĉe Twitter";
 $a->strings["Twitter settings updated."] = "Ĝisdatigis Twitter agordojn.";\r
 $a->strings["Twitter Posting Settings"] = "Agordoj por afiŝi ĉe Twitter";\r
 $a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Ne trovis klientajn ŝlosilojn por Twitter. Bonvolu kontakti vian retejan administranton.";\r
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Je ĉi tiu Friendica retejo, la Twitter kromprogramo jam estas ŝaltita, sed via konto anokoraŭ ne estas konektita kun via Twitter konto. Por fari tion, klaku la supran butonon por atingi nombrokodon de Twitter, kion vi kopiu en la supran eniga ĉelo, kaj  sendu la formularon. Nur viaj <strong>publikaj</strong> afiŝoj estas plusendota al Twitter. ";\r
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Je ĉi tiu Friendica retejo, la Twitter kromprogramo jam estas ŝaltita, sed via konto anokoraŭ ne estas konektita kun via Twitter konto. Por fari tion, klaku la supran butonon por atingi nombrokodon de Twitter, kion vi kopiu en la supran eniga ĉelo, kaj  sendu la formularon. Nur viaj <strong>publikaj</strong> afiŝoj estas plusendota al Twitter. ";\r
 $a->strings["Log in with Twitter"] = "Ensaluti kun Twitter";\r
 $a->strings["Copy the PIN from Twitter here"] = "Alglui la PIN de Twitter ĉi tie";\r
 $a->strings["Submit"] = "Sendi";\r
index 6cb699489195ae7dcb32416db8d5fb21cec84eac..739ac523fb1d8269dcb0e5025c6cf711b4c3eb35 100644 (file)
@@ -39,12 +39,12 @@ msgstr "No hay par de claves para encuentro de Twitter."
 
 #: twitter.php:183
 msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
 "yet connected your account to your Twitter account. To do so click the "
 "button below to get a PIN from Twitter which you have to copy into the input"
 " box below and submit the form. Only your <strong>public</strong> posts will"
 " be posted to Twitter."
-msgstr "En esta petición de Friendica el plugin de Twitter estaba activo pero usted no ha conectado aún su cuenta con la cuenta de Twitter. Para hacerlo click en el botón de abajo para obtener un PIN desde Twitter que tiene que copiar en la caja de texto de abajo y enviar el formulario. Sólo sus entradas <strong>públicas</strong> serán posteadas en Twitter"
+msgstr "En esta petición de Friendica el addon de Twitter estaba activo pero usted no ha conectado aún su cuenta con la cuenta de Twitter. Para hacerlo click en el botón de abajo para obtener un PIN desde Twitter que tiene que copiar en la caja de texto de abajo y enviar el formulario. Sólo sus entradas <strong>públicas</strong> serán posteadas en Twitter"
 
 #: twitter.php:184
 msgid "Log in with Twitter"
index c1168e4a0bc3a5ace91dac38ee28edb69971dec7..812e646becf37e3d3561f4cc6bd57097f139f7b8 100644 (file)
@@ -9,7 +9,7 @@ $a->strings["Post to Twitter"] = "Entrada para Twitter";
 $a->strings["Twitter settings updated."] = "Ajustes de Twitter actualizados.";
 $a->strings["Twitter Posting Settings"] = "Ajustes de publicación de Twitter";
 $a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "No hay par de claves para encuentro de Twitter.";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "En esta petición de Friendica el plugin de Twitter estaba activo pero usted no ha conectado aún su cuenta con la cuenta de Twitter. Para hacerlo click en el botón de abajo para obtener un PIN desde Twitter que tiene que copiar en la caja de texto de abajo y enviar el formulario. Sólo sus entradas <strong>públicas</strong> serán posteadas en Twitter";
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "En esta petición de Friendica el addon de Twitter estaba activo pero usted no ha conectado aún su cuenta con la cuenta de Twitter. Para hacerlo click en el botón de abajo para obtener un PIN desde Twitter que tiene que copiar en la caja de texto de abajo y enviar el formulario. Sólo sus entradas <strong>públicas</strong> serán posteadas en Twitter";
 $a->strings["Log in with Twitter"] = "Iniciar sesión con Twitter";
 $a->strings["Copy the PIN from Twitter here"] = "Copie el PIN de Twitter aquí";
 $a->strings["Submit"] = "Enviar";
index abddb85f85e5e010e22882a14f6327fa2a436492..6b898264d10fd95bdf9026fa9848a6e155007ffc 100644 (file)
@@ -40,7 +40,7 @@ msgstr ""
 
 #: twitter.php:183
 msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
 "yet connected your account to your Twitter account. To do so click the "
 "button below to get a PIN from Twitter which you have to copy into the input"
 " box below and submit the form. Only your <strong>public</strong> posts will"
index de9e80a06273eb08f0285361cb23a0e84fc9ea20..d79c5cf960398730f9b4e18c41e8ef7f4e1db8ad 100644 (file)
@@ -9,7 +9,7 @@ $a->strings["Post to Twitter"] = "Publier sur Twitter";
 $a->strings["Twitter settings updated."] = "Paramètres Twitter mis à jour.";
 $a->strings["Twitter Posting Settings"] = "Paramètres Twitter de publication";
 $a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "";
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "";
 $a->strings["Log in with Twitter"] = "Se connecter avec Twitter";
 $a->strings["Copy the PIN from Twitter here"] = "Copier le PIN de Twitter ici";
 $a->strings["Submit"] = "Soumettre";
index edd7809b09ffb342636dd4e8f134c7e31e500354..66d1836d57a70613cf68c7ddd1eb3ed81b9206a5 100644 (file)
@@ -4,7 +4,7 @@ $a->strings["Post to Twitter"] = "Senda færslu á Twitter";
 $a->strings["Twitter settings updated."] = "Stillingar Twitter uppfærðar.";\r
 $a->strings["Twitter Posting Settings"] = "Twitter færslu stillingar";\r
 $a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Ekkert notenda lykils par fyrir Twitter fundið.  Hafðu samband við kerfisstjórann.";\r
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "";\r
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "";\r
 $a->strings["Log in with Twitter"] = "Innskrá með Twitter";\r
 $a->strings["Copy the PIN from Twitter here"] = "Afrita PIN frá Twitter hingað";\r
 $a->strings["Submit"] = "Senda inn";\r
index ef14b5bb08174700035e6b407304ff02024eb9c5..b75a822073552e66378b9efff7405ea20c376d37 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:29+0000\n"
+"POT-Creation-Date: 2018-02-08 07:07+0100\n"
+"PO-Revision-Date: 2018-03-19 13:09+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -19,105 +19,106 @@ msgstr ""
 "Language: it\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: twitter.php:77
+#: twitter.php:193
 msgid "Post to Twitter"
 msgstr "Invia a Twitter"
 
-#: twitter.php:129
+#: twitter.php:234
+msgid ""
+"You submitted an empty PIN, please Sign In with Twitter again to get a new "
+"one."
+msgstr "Hai inserito un PIN vuoto, autenticati con Twitter nuovamente per averne uno nuovo."
+
+#: twitter.php:261
 msgid "Twitter settings updated."
 msgstr "Impostazioni di Twitter aggiornate."
 
-#: twitter.php:157
-msgid "Twitter Posting Settings"
-msgstr "Impostazioni di invio a Twitter"
+#: twitter.php:291 twitter.php:295
+msgid "Twitter Import/Export/Mirror"
+msgstr "Importa/Esporta/Clona Twitter"
 
-#: twitter.php:164
+#: twitter.php:302
 msgid ""
 "No consumer key pair for Twitter found. Please contact your site "
 "administrator."
 msgstr "Nessuna coppia di chiavi per Twitter trovata. Contatta l'amministratore del sito."
 
-#: twitter.php:183
+#: twitter.php:314
 msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
 "yet connected your account to your Twitter account. To do so click the "
 "button below to get a PIN from Twitter which you have to copy into the input"
 " box below and submit the form. Only your <strong>public</strong> posts will"
 " be posted to Twitter."
-msgstr "Il plugin Twitter è abilitato ma non hai ancora collegato i tuoi account Friendica e Twitter. Per farlo, clicca il bottone qui sotto per ricevere un PIN da Twitter che dovrai copiare nel campo qui sotto. Solo i tuoi post <strong>pubblici</strong> saranno inviati a Twitter."
+msgstr "Il componente aggiuntivo Twitter è abilitato ma non hai ancora collegato i tuoi account Friendica e Twitter. Per farlo, clicca il bottone qui sotto per ricevere un PIN da Twitter che dovrai copiare nel campo qui sotto. Solo i tuoi post <strong>pubblici</strong> saranno inviati a Twitter."
 
-#: twitter.php:184
+#: twitter.php:315
 msgid "Log in with Twitter"
 msgstr "Accedi con Twitter"
 
-#: twitter.php:186
+#: twitter.php:317
 msgid "Copy the PIN from Twitter here"
 msgstr "Copia il PIN da Twitter qui"
 
-#: twitter.php:191 twitter.php:229 twitter.php:556
-msgid "Submit"
-msgstr "Invia"
+#: twitter.php:322 twitter.php:364 twitter.php:642
+msgid "Save Settings"
+msgstr "Salva Impostazioni"
 
-#: twitter.php:200
+#: twitter.php:334
 msgid "Currently connected to: "
 msgstr "Al momento connesso con:"
 
-#: twitter.php:201
+#: twitter.php:335
+msgid "Disconnect"
+msgstr "Disconnetti"
+
+#: twitter.php:345
+msgid "Allow posting to Twitter"
+msgstr "Permetti l'invio a Twitter"
+
+#: twitter.php:345
 msgid ""
 "If enabled all your <strong>public</strong> postings can be posted to the "
 "associated Twitter account. You can choose to do so by default (here) or for"
 " every posting separately in the posting options when writing the entry."
 msgstr "Se abilitato tutti i tuoi messaggi <strong>pubblici</strong> possono essere inviati all'account Twitter associato. Puoi scegliere di farlo sempre (qui) o ogni volta che invii, nelle impostazioni di privacy del messaggio."
 
-#: twitter.php:203
+#: twitter.php:348
 msgid ""
-"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
+"<strong>Note</strong>: Due to your privacy settings (<em>Hide your profile "
 "details from unknown viewers?</em>) the link potentially included in public "
 "postings relayed to Twitter will lead the visitor to a blank page informing "
 "the visitor that the access to your profile has been restricted."
-msgstr "<strong>Nota</strong>: A causa delle tue impostazioni di privacy(<em>Nascondi i dettagli del tuo profilo ai visitatori sconosciuti?</em>) il link potenzialmente incluse nei messaggi pubblici inviati a Twitter porterà i visitatori a una pagina bianca con una nota che li informa che l'accesso al tuo profilo è stato limitato."
+msgstr "<strong>Nota</strong>: A causa delle tue impostazioni di privacy(<em>Nascondi i dettagli del tuo profilo ai visitatori sconosciuti?</em>) il link potenzialmente incluso nei messaggi pubblici inviati a Twitter porterà i visitatori a una pagina bianca con una nota che li informa che l'accesso al tuo profilo è stato limitato."
 
-#: twitter.php:206
-msgid "Allow posting to Twitter"
-msgstr "Permetti l'invio a Twitter"
-
-#: twitter.php:209
+#: twitter.php:351
 msgid "Send public postings to Twitter by default"
 msgstr "Invia sempre i messaggi pubblici a Twitter"
 
-#: twitter.php:213
-msgid "Mirror all posts from twitter that are no replies or retweets"
-msgstr "Clona tutti i messaggi da Twitter che non sono risposte or retweet"
+#: twitter.php:354
+msgid "Mirror all posts from twitter that are no replies"
+msgstr "Clona tutti i messaggi da Twitter che non sono risposte"
 
-#: twitter.php:217
-msgid "Shortening method that optimizes the tweet"
-msgstr "Metodo di accorciatura che ottimizza i tweet"
+#: twitter.php:357
+msgid "Import the remote timeline"
+msgstr "Importa la timeline remota"
 
-#: twitter.php:221
-msgid "Send linked #-tags and @-names to Twitter"
-msgstr "Invia i link dei #tag e dei @nomi a Twitter"
+#: twitter.php:360
+msgid "Automatically create contacts"
+msgstr "Crea automaticamente i contatti"
 
-#: twitter.php:226
-msgid "Clear OAuth configuration"
-msgstr "Rimuovi la configurazione OAuth"
+#: twitter.php:619
+msgid "Twitter post failed. Queued for retry."
+msgstr "Invio a Twitter fallito. In coda per riprovare."
 
-#: twitter.php:550
+#: twitter.php:634
 msgid "Settings updated."
 msgstr "Impostazioni aggiornate."
 
-#: twitter.php:558
+#: twitter.php:644
 msgid "Consumer key"
 msgstr "Consumer key"
 
-#: twitter.php:559
+#: twitter.php:645
 msgid "Consumer secret"
 msgstr "Consumer secret"
-
-#: twitter.php:560
-msgid "Name of the Twitter Application"
-msgstr "Nome dell'applicazione Twitter"
-
-#: twitter.php:560
-msgid ""
-"set this to avoid mirroring postings from ~friendica back to ~friendica"
-msgstr "imposta questo per evitare di clonare i messaggi da Friendica nuovamente in Friendica"
index 446c7de208098b7daed4eac90a208d773d547465..da75a3cbfef67515c9cea77b9aa803d763b0282b 100644 (file)
@@ -6,24 +6,24 @@ function string_plural_select_it($n){
 }}
 ;
 $a->strings["Post to Twitter"] = "Invia a Twitter";
+$a->strings["You submitted an empty PIN, please Sign In with Twitter again to get a new one."] = "Hai inserito un PIN vuoto, autenticati con Twitter nuovamente per averne uno nuovo.";
 $a->strings["Twitter settings updated."] = "Impostazioni di Twitter aggiornate.";
-$a->strings["Twitter Posting Settings"] = "Impostazioni di invio a Twitter";
+$a->strings["Twitter Import/Export/Mirror"] = "Importa/Esporta/Clona Twitter";
 $a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Nessuna coppia di chiavi per Twitter trovata. Contatta l'amministratore del sito.";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Il plugin Twitter è abilitato ma non hai ancora collegato i tuoi account Friendica e Twitter. Per farlo, clicca il bottone qui sotto per ricevere un PIN da Twitter che dovrai copiare nel campo qui sotto. Solo i tuoi post <strong>pubblici</strong> saranno inviati a Twitter.";
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Il componente aggiuntivo Twitter è abilitato ma non hai ancora collegato i tuoi account Friendica e Twitter. Per farlo, clicca il bottone qui sotto per ricevere un PIN da Twitter che dovrai copiare nel campo qui sotto. Solo i tuoi post <strong>pubblici</strong> saranno inviati a Twitter.";
 $a->strings["Log in with Twitter"] = "Accedi con Twitter";
 $a->strings["Copy the PIN from Twitter here"] = "Copia il PIN da Twitter qui";
-$a->strings["Submit"] = "Invia";
+$a->strings["Save Settings"] = "Salva Impostazioni";
 $a->strings["Currently connected to: "] = "Al momento connesso con:";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Se abilitato tutti i tuoi messaggi <strong>pubblici</strong> possono essere inviati all'account Twitter associato. Puoi scegliere di farlo sempre (qui) o ogni volta che invii, nelle impostazioni di privacy del messaggio.";
-$a->strings["<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Nota</strong>: A causa delle tue impostazioni di privacy(<em>Nascondi i dettagli del tuo profilo ai visitatori sconosciuti?</em>) il link potenzialmente incluse nei messaggi pubblici inviati a Twitter porterà i visitatori a una pagina bianca con una nota che li informa che l'accesso al tuo profilo è stato limitato.";
+$a->strings["Disconnect"] = "Disconnetti";
 $a->strings["Allow posting to Twitter"] = "Permetti l'invio a Twitter";
+$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Se abilitato tutti i tuoi messaggi <strong>pubblici</strong> possono essere inviati all'account Twitter associato. Puoi scegliere di farlo sempre (qui) o ogni volta che invii, nelle impostazioni di privacy del messaggio.";
+$a->strings["<strong>Note</strong>: Due to your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Nota</strong>: A causa delle tue impostazioni di privacy(<em>Nascondi i dettagli del tuo profilo ai visitatori sconosciuti?</em>) il link potenzialmente incluso nei messaggi pubblici inviati a Twitter porterà i visitatori a una pagina bianca con una nota che li informa che l'accesso al tuo profilo è stato limitato.";
 $a->strings["Send public postings to Twitter by default"] = "Invia sempre i messaggi pubblici a Twitter";
-$a->strings["Mirror all posts from twitter that are no replies or retweets"] = "Clona tutti i messaggi da Twitter che non sono risposte or retweet";
-$a->strings["Shortening method that optimizes the tweet"] = "Metodo di accorciatura che ottimizza i tweet";
-$a->strings["Send linked #-tags and @-names to Twitter"] = "Invia i link dei #tag e dei @nomi a Twitter";
-$a->strings["Clear OAuth configuration"] = "Rimuovi la configurazione OAuth";
+$a->strings["Mirror all posts from twitter that are no replies"] = "Clona tutti i messaggi da Twitter che non sono risposte";
+$a->strings["Import the remote timeline"] = "Importa la timeline remota";
+$a->strings["Automatically create contacts"] = "Crea automaticamente i contatti";
+$a->strings["Twitter post failed. Queued for retry."] = "Invio a Twitter fallito. In coda per riprovare.";
 $a->strings["Settings updated."] = "Impostazioni aggiornate.";
 $a->strings["Consumer key"] = "Consumer key";
 $a->strings["Consumer secret"] = "Consumer secret";
-$a->strings["Name of the Twitter Application"] = "Nome dell'applicazione Twitter";
-$a->strings["set this to avoid mirroring postings from ~friendica back to ~friendica"] = "imposta questo per evitare di clonare i messaggi da Friendica nuovamente in Friendica";
index 00a0f111aac08364757315ee6dae9e45f1351f8c..6330249cc55dad66a4bcf487c61f6b99cc074439 100644 (file)
@@ -4,7 +4,7 @@ $a->strings["Post to Twitter"] = "Post til Twitter";
 $a->strings["Twitter settings updated."] = "Twitter-innstilinger oppdatert.";\r
 $a->strings["Twitter Posting Settings"] = "Innstillinger for posting til Twitter";\r
 $a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Ingen \"consumer key pair\" for Twitter funnet. Vennligst kontakt stedets administrator.";\r
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Ved denne Friendica-forekomsten er Twitter-tillegget aktivert, men du har ennå ikke tilkoblet din konto til din Twitter-konto. For å gjøre det, klikk på knappen nedenfor for å få en PIN-kode fra Twitter som du må kopiere inn i feltet nedenfor og sende inn skjemaet. Bare dine <strong>offentlige</strong> innlegg vil bli lagt inn på Twitter. ";\r
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Ved denne Friendica-forekomsten er Twitter-tillegget aktivert, men du har ennå ikke tilkoblet din konto til din Twitter-konto. For å gjøre det, klikk på knappen nedenfor for å få en PIN-kode fra Twitter som du må kopiere inn i feltet nedenfor og sende inn skjemaet. Bare dine <strong>offentlige</strong> innlegg vil bli lagt inn på Twitter. ";\r
 $a->strings["Log in with Twitter"] = "Logg inn via Twitter";\r
 $a->strings["Copy the PIN from Twitter here"] = "Kopier PIN-kode fra Twitter hit";\r
 $a->strings["Submit"] = "Lagre";\r
index 54d3acae7a2e4e9e3490d9fe6322aff40244abef..3afb1506804d768409f7ead60a7ed3c50763db0f 100644 (file)
@@ -4,7 +4,7 @@ $a->strings["Post to Twitter"] = "Post na Twitter";
 $a->strings["Twitter settings updated."] = "Zaktualizowano ustawienia Twittera.";\r
 $a->strings["Twitter Posting Settings"] = "Ustawienia wpisów z Twittera";\r
 $a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Nie znaleziono pary dla Twittera. Proszę skontaktować się z admininstratorem strony.";\r
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "";\r
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "";\r
 $a->strings["Log in with Twitter"] = "Zaloguj się przez Twitter";\r
 $a->strings["Copy the PIN from Twitter here"] = "Skopiuj tutaj PIN z Twittera";\r
 $a->strings["Submit"] = "Potwierdź";\r
index df121428b4607918d9b3bfb342a07e8399dc1bcc..56630fecfa9fb9d8d8c9ef1a2d61a30fb166a0f0 100644 (file)
@@ -39,7 +39,7 @@ msgstr "Não foi encontrado nenhum par de \"consumer keys\" para o Twitter. Por
 
 #: twitter.php:183
 msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
 "yet connected your account to your Twitter account. To do so click the "
 "button below to get a PIN from Twitter which you have to copy into the input"
 " box below and submit the form. Only your <strong>public</strong> posts will"
index edc4b9162aa7094b1767b0ffe239fddf2c32f9b4..698b761e2e8fa9f70cd598a11dcc16b86737f46a 100644 (file)
@@ -9,7 +9,7 @@ $a->strings["Post to Twitter"] = "Publicar no Twitter";
 $a->strings["Twitter settings updated."] = "As configurações do Twitter foram atualizadas.";
 $a->strings["Twitter Posting Settings"] = "Configurações de publicação no Twitter";
 $a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Não foi encontrado nenhum par de \"consumer keys\" para o Twitter. Por favor, entre em contato com a administração do site.";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "O plug-in do Twitter está habilitado nesta instância do Friendica, mas você ainda não conectou sua conta aqui à sua conta no Twitter. Para fazer isso, clique no botão abaixo. Você vai receber um código de verificação do Twitter. Copie-o para o campo abaixo e envie o formulário. Apenas os seus posts <strong>públicos</strong> serão publicados no Twitter.";
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "O plug-in do Twitter está habilitado nesta instância do Friendica, mas você ainda não conectou sua conta aqui à sua conta no Twitter. Para fazer isso, clique no botão abaixo. Você vai receber um código de verificação do Twitter. Copie-o para o campo abaixo e envie o formulário. Apenas os seus posts <strong>públicos</strong> serão publicados no Twitter.";
 $a->strings["Log in with Twitter"] = "Entrar com o Twitter";
 $a->strings["Copy the PIN from Twitter here"] = "Cole o código de verificação do Twitter aqui";
 $a->strings["Submit"] = "Enviar";
index 27e0d553d49c61f3f324d58701f1ea52adfbf2ee..46407c733ab4b2a89dafef2564799de9021b9166 100644 (file)
@@ -38,7 +38,7 @@ msgstr "Nici o pereche de chei de utilizator pentru Twitter nu a fost găsită.
 
 #: twitter.php:264
 msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
 "yet connected your account to your Twitter account. To do so click the "
 "button below to get a PIN from Twitter which you have to copy into the input"
 " box below and submit the form. Only your <strong>public</strong> posts will"
index d941d001967e64b72f7a9e413a491d36c53e4b39..36a36e8c5c0d130fd4316a52caf06dd4e8a50be6 100644 (file)
@@ -9,7 +9,7 @@ $a->strings["Post to Twitter"] = "Postați pe Twitter";
 $a->strings["Twitter settings updated."] = "Configurările Twitter au fost actualizate.";
 $a->strings["Twitter Import/Export/Mirror"] = "Import/Export/Clonare Twitter";
 $a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Nici o pereche de chei de utilizator pentru Twitter nu a fost găsită. Vă rugăm să vă contactați administratorul de site.";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Pe această sesiune Friendica, modulul Twitter era activat, dar încă nu v-ați conectat contul la profilul dvs. Twitter. Pentru aceasta apăsați pe butonul de mai jos pentru a obține un PIN de pe Twitter pe care va trebui să îl copiați în caseta de introducere mai jos şi trimiteți formularul. Numai postările dumneavoastră <strong>publice</strong> vor fi postate pe Twitter.";
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Pe această sesiune Friendica, modulul Twitter era activat, dar încă nu v-ați conectat contul la profilul dvs. Twitter. Pentru aceasta apăsați pe butonul de mai jos pentru a obține un PIN de pe Twitter pe care va trebui să îl copiați în caseta de introducere mai jos şi trimiteți formularul. Numai postările dumneavoastră <strong>publice</strong> vor fi postate pe Twitter.";
 $a->strings["Log in with Twitter"] = "Autentificare prin Twitter";
 $a->strings["Copy the PIN from Twitter here"] = "Copiați aici PIN-ul de la Twitter";
 $a->strings["Save Settings"] = "Salvare Configurări";
index 9418282a632f8e72310c44599d25ad86af91e848..911b2e083a3440759c7e106cbb2c79ba8f6182bc 100644 (file)
@@ -39,7 +39,7 @@ msgstr "Не найдено пары потребительских ключей
 
 #: twitter.php:183
 msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
+"At this Friendica instance the Twitter addon was enabled but you have not "
 "yet connected your account to your Twitter account. To do so click the "
 "button below to get a PIN from Twitter which you have to copy into the input"
 " box below and submit the form. Only your <strong>public</strong> posts will"
index c2210cbbb93d5f86ccdebd8b09b7548f03070389..39e61e4ecdde6567eb9692da8b3988a7135de0cb 100644 (file)
@@ -9,7 +9,7 @@ $a->strings["Post to Twitter"] = "Отправить в Twitter";
 $a->strings["Twitter settings updated."] = "Настройки Twitter обновлены.";
 $a->strings["Twitter Posting Settings"] = "Настройка отправки сообщений в Twitter";
 $a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Не найдено пары потребительских ключей для Twitter. Пожалуйста, обратитесь к администратору сайта.";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Чтобы подключиться к Twitter аккаунту, нажмите на кнопку ниже, чтобы получить код безопасности от Twitter, который нужно скопировать в поле ввода ниже, и отправить форму. Только ваши <strong>публичные сообщения</strong> будут отправляться на Twitter.";
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Чтобы подключиться к Twitter аккаунту, нажмите на кнопку ниже, чтобы получить код безопасности от Twitter, который нужно скопировать в поле ввода ниже, и отправить форму. Только ваши <strong>публичные сообщения</strong> будут отправляться на Twitter.";
 $a->strings["Log in with Twitter"] = "Войдите через Twitter";
 $a->strings["Copy the PIN from Twitter here"] = "Скопируйте PIN с Twitter сюда";
 $a->strings["Submit"] = "Подтвердить";
index 02cb3fdd9f8e914b4ce67db1c0c8fec5700daad8..3f9d77c8c0d8620a82ce4cd8e98f972f2b7af0a5 100644 (file)
@@ -3,7 +3,7 @@
 $a->strings["Post to Twitter"] = "L&auml;gg in p&aring; Twitter";\r
 $a->strings["Twitter Posting Settings"] = "Inst&auml;llningar f&ouml;r inl&auml;gg p&aring; Twitter";\r
 $a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "No consumer key pair for Twitter found. Please contact your site administrator.";\r
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter.";\r
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter.";\r
 $a->strings["Copy the PIN from Twitter here"] = "Ange PIN-koden fr&aring;n Twitter h&auml;r";\r
 $a->strings["Submit"] = "Spara";\r
 $a->strings["Currently connected to: "] = "Ansluten till: ";\r
index 9f8f7058bd3a94f57f7d09e27ea97d74b3c26f73..402534c1e6ec6bb0b27cd71487a018a157571a32 100644 (file)
@@ -4,7 +4,7 @@ $a->strings["Post to Twitter"] = "发送到在Twitter";
 $a->strings["Twitter settings updated."] = "Twitter设置更新了。";\r
 $a->strings["Twitter Posting Settings"] = "Twitter发送设置";\r
 $a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "找不到Twitter的消费钥匙双。请联系您的网页行政人员。";\r
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "在这个Friendica网站使Twitter插件可用的可您还没有把您的账户和您Twitter账户连通。为这做点击下边的按钮得到密码从Twitter您要粘贴在下边的输入框和提交。只您的<strong>公开</strong>文章被发送到Twitter。";\r
+$a->strings["At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "在这个Friendica网站使Twitter插件可用的可您还没有把您的账户和您Twitter账户连通。为这做点击下边的按钮得到密码从Twitter您要粘贴在下边的输入框和提交。只您的<strong>公开</strong>文章被发送到Twitter。";\r
 $a->strings["Log in with Twitter"] = "用Twitter登记";\r
 $a->strings["Copy the PIN from Twitter here"] = "复制Twitter密码这儿";\r
 $a->strings["Submit"] = "提交";\r
index 7272957ca6e7294c7612ea0abdfcb0b4e9fe3849..148a498b1d3fbbff5877c99426c80b4574f10c45 100644 (file)
@@ -2,11 +2,12 @@
 /**
  * Name: Twitter Connector
  * Description: Bidirectional (posting, relaying and reading) connector for Twitter.
- * Version: 1.0.4
+ * Version: 1.1.0
  * Author: Tobias Diekershoff <https://f.diekershoff.de/profile/tobias>
  * Author: Michael Vogel <https://pirati.ca/profile/heluecht>
+ * Maintainer: Hypolite Petovan <https://friendica.mrpetovan.com/profile/hypolite>
  *
- * Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel
+ * Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel, Hypolite Petovan
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -32,8 +33,7 @@
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  */
-
-/*   Twitter Plugin for Friendica
+/*   Twitter Addon for Friendica
  *
  *   Author: Tobias Diekershoff
  *           tobias.diekershoff@gmx.net
@@ -41,7 +41,7 @@
  *   License:3-clause BSD license
  *
  *   Configuration:
- *     To use this plugin you need a OAuth Consumer key pair (key & secret)
+ *     To use this addon you need a OAuth Consumer key pair (key & secret)
  *     you can get it from Twitter at https://twitter.com/apps
  *
  *     Register your Friendica site as "Client" application with "Read & Write" access
  *     $a->config['twitter']['consumerkey'] = 'your consumer_key here';
  *     $a->config['twitter']['consumersecret'] = 'your consumer_secret here';
  *
- *     To activate the plugin itself add it to the $a->config['system']['addon']
+ *     To activate the addon itself add it to the $a->config['system']['addon']
  *     setting. After this, your user can configure their Twitter account settings
- *     from "Settings -> Plugin Settings".
+ *     from "Settings -> Addon Settings".
  *
- *     Requirements: PHP5, curl [Slinky library]
+ *     Requirements: PHP5, curl
  */
 
-require_once('include/enotify.php');
-require_once("include/socgraph.php");
+use Abraham\TwitterOAuth\TwitterOAuth;
+use Friendica\App;
+use Friendica\Content\OEmbed;
+use Friendica\Content\Text\BBCode;
+use Friendica\Content\Text\Plaintext;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Core\Worker;
+use Friendica\Model\GContact;
+use Friendica\Model\Group;
+use Friendica\Model\Item;
+use Friendica\Model\Photo;
+use Friendica\Model\Queue;
+use Friendica\Model\User;
+use Friendica\Object\Image;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
+
+require_once 'boot.php';
+require_once 'include/dba.php';
+require_once 'include/enotify.php';
+require_once 'include/text.php';
+
+require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
 
 define('TWITTER_DEFAULT_POLL_INTERVAL', 5); // given in minutes
 
 function twitter_install() {
        //  we need some hooks, for the configuration and for sending tweets
-       register_hook('connector_settings', 'addon/twitter/twitter.php', 'twitter_settings');
-       register_hook('connector_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post');
-       register_hook('post_local', 'addon/twitter/twitter.php', 'twitter_post_local');
-       register_hook('notifier_normal', 'addon/twitter/twitter.php', 'twitter_post_hook');
-       register_hook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets');
-       register_hook('cron', 'addon/twitter/twitter.php', 'twitter_cron');
-       register_hook('queue_predeliver', 'addon/twitter/twitter.php', 'twitter_queue_hook');
-       register_hook('follow', 'addon/twitter/twitter.php', 'twitter_follow');
-       register_hook('expire', 'addon/twitter/twitter.php', 'twitter_expire');
-       register_hook('prepare_body', 'addon/twitter/twitter.php', 'twitter_prepare_body');
-       register_hook('check_item_notification','addon/twitter/twitter.php', 'twitter_check_item_notification');
+       Addon::registerHook('connector_settings', 'addon/twitter/twitter.php', 'twitter_settings');
+       Addon::registerHook('connector_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post');
+       Addon::registerHook('post_local', 'addon/twitter/twitter.php', 'twitter_post_local');
+       Addon::registerHook('notifier_normal', 'addon/twitter/twitter.php', 'twitter_post_hook');
+       Addon::registerHook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets');
+       Addon::registerHook('cron', 'addon/twitter/twitter.php', 'twitter_cron');
+       Addon::registerHook('queue_predeliver', 'addon/twitter/twitter.php', 'twitter_queue_hook');
+       Addon::registerHook('follow', 'addon/twitter/twitter.php', 'twitter_follow');
+       Addon::registerHook('expire', 'addon/twitter/twitter.php', 'twitter_expire');
+       Addon::registerHook('prepare_body', 'addon/twitter/twitter.php', 'twitter_prepare_body');
+       Addon::registerHook('check_item_notification', 'addon/twitter/twitter.php', 'twitter_check_item_notification');
        logger("installed twitter");
 }
 
-
-function twitter_uninstall() {
-       unregister_hook('connector_settings', 'addon/twitter/twitter.php', 'twitter_settings');
-       unregister_hook('connector_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post');
-       unregister_hook('post_local', 'addon/twitter/twitter.php', 'twitter_post_local');
-       unregister_hook('notifier_normal', 'addon/twitter/twitter.php', 'twitter_post_hook');
-       unregister_hook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets');
-       unregister_hook('cron', 'addon/twitter/twitter.php', 'twitter_cron');
-       unregister_hook('queue_predeliver', 'addon/twitter/twitter.php', 'twitter_queue_hook');
-       unregister_hook('follow', 'addon/twitter/twitter.php', 'twitter_follow');
-       unregister_hook('expire', 'addon/twitter/twitter.php', 'twitter_expire');
-       unregister_hook('prepare_body', 'addon/twitter/twitter.php', 'twitter_prepare_body');
-       unregister_hook('check_item_notification','addon/twitter/twitter.php', 'twitter_check_item_notification');
+function twitter_uninstall()
+{
+       Addon::unregisterHook('connector_settings', 'addon/twitter/twitter.php', 'twitter_settings');
+       Addon::unregisterHook('connector_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post');
+       Addon::unregisterHook('post_local', 'addon/twitter/twitter.php', 'twitter_post_local');
+       Addon::unregisterHook('notifier_normal', 'addon/twitter/twitter.php', 'twitter_post_hook');
+       Addon::unregisterHook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets');
+       Addon::unregisterHook('cron', 'addon/twitter/twitter.php', 'twitter_cron');
+       Addon::unregisterHook('queue_predeliver', 'addon/twitter/twitter.php', 'twitter_queue_hook');
+       Addon::unregisterHook('follow', 'addon/twitter/twitter.php', 'twitter_follow');
+       Addon::unregisterHook('expire', 'addon/twitter/twitter.php', 'twitter_expire');
+       Addon::unregisterHook('prepare_body', 'addon/twitter/twitter.php', 'twitter_prepare_body');
+       Addon::unregisterHook('check_item_notification', 'addon/twitter/twitter.php', 'twitter_check_item_notification');
 
        // old setting - remove only
-       unregister_hook('post_local_end', 'addon/twitter/twitter.php', 'twitter_post_hook');
-       unregister_hook('plugin_settings', 'addon/twitter/twitter.php', 'twitter_settings');
-       unregister_hook('plugin_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post');
-
+       Addon::unregisterHook('post_local_end', 'addon/twitter/twitter.php', 'twitter_post_hook');
+       Addon::unregisterHook('addon_settings', 'addon/twitter/twitter.php', 'twitter_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post');
 }
 
 function twitter_check_item_notification($a, &$notification_data) {
@@ -127,21 +150,19 @@ function twitter_follow($a, &$contact) {
 
        $uid = $a->user["uid"];
 
-       $ckey    = get_config('twitter', 'consumerkey');
-       $csecret = get_config('twitter', 'consumersecret');
-       $otoken  = get_pconfig($uid, 'twitter', 'oauthtoken');
-       $osecret = get_pconfig($uid, 'twitter', 'oauthsecret');
-
-       require_once("addon/twitter/codebird.php");
-
-       $cb = \Codebird\Codebird::getInstance();
-       $cb->setConsumerKey($ckey, $csecret);
-       $cb->setToken($otoken, $osecret);
+       $ckey = Config::get('twitter', 'consumerkey');
+       $csecret = Config::get('twitter', 'consumersecret');
+       $otoken = PConfig::get($uid, 'twitter', 'oauthtoken');
+       $osecret = PConfig::get($uid, 'twitter', 'oauthsecret');
 
-       $parameters = array();
-       $parameters["screen_name"] = $nickname;
+       // If the addon is not configured (general or for this user) quit here
+       if (empty($ckey) || empty($csecret) || empty($otoken) || empty($osecret)) {
+               $contact = false;
+               return;
+       }
 
-       $user = $cb->friendships_create($parameters);
+       $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
+       $connection->post('friendships/create', ['screen_name' => $nickname]);
 
        twitter_fetchuser($a, $uid, $nickname);
 
@@ -162,7 +183,7 @@ function twitter_jot_nets(&$a,&$b) {
                $tw_defpost = get_pconfig(local_user(),'twitter','post_by_default');
                $selected = ((intval($tw_defpost) == 1) ? ' checked="checked" ' : '');
                $b .= '<div class="profile-jot-net"><input type="checkbox" name="twitter_enable"' . $selected . ' value="1" /> '
-                       . t('Post to Twitter') . '</div>';
+                       . L10n::t('Post to Twitter') . '</div>';
        }
 }
 
@@ -170,11 +191,11 @@ function twitter_settings_post ($a,$post) {
        if(! local_user())
                return;
        // don't check twitter settings if twitter submit button is not clicked
-       if (!x($_POST,'twitter-submit'))
+       if (empty($_POST['twitter-disconnect']) && empty($_POST['twitter-submit'])) {
                return;
 
-       if (isset($_POST['twitter-disconnect'])) {
-               /***
+       if (!empty($_POST['twitter-disconnect'])) {
+               /*               * *
                 * if the twitter-disconnect checkbox is set, clear the OAuth key/secret pair
                 * from the user configuration
                 */
@@ -190,37 +211,46 @@ function twitter_settings_post ($a,$post) {
                del_pconfig(local_user(), 'twitter', 'create_user');
                del_pconfig(local_user(), 'twitter', 'own_id');
        } else {
-       if (isset($_POST['twitter-pin'])) {
-               //  if the user supplied us with a PIN from Twitter, let the magic of OAuth happen
-               logger('got a Twitter PIN');
-               require_once('library/twitteroauth.php');
-               $ckey    = get_config('twitter', 'consumerkey');
-               $csecret = get_config('twitter', 'consumersecret');
-               //  the token and secret for which the PIN was generated were hidden in the settings
-               //  form as token and token2, we need a new connection to Twitter using these token
-               //  and secret to request a Access Token with the PIN
-               $connection = new TwitterOAuth($ckey, $csecret, $_POST['twitter-token'], $_POST['twitter-token2']);
-               $token   = $connection->getAccessToken( $_POST['twitter-pin'] );
-               //  ok, now that we have the Access Token, save them in the user config
-               set_pconfig(local_user(),'twitter', 'oauthtoken',  $token['oauth_token']);
-               set_pconfig(local_user(),'twitter', 'oauthsecret', $token['oauth_token_secret']);
-               set_pconfig(local_user(),'twitter', 'post', 1);
-               //  reload the Addon Settings page, if we don't do it see Bug #42
-               goaway($a->get_baseurl().'/settings/connectors');
-       } else {
-               //  if no PIN is supplied in the POST variables, the user has changed the setting
-               //  to post a tweet for every new __public__ posting to the wall
-               set_pconfig(local_user(),'twitter','post',intval($_POST['twitter-enable']));
-               set_pconfig(local_user(),'twitter','post_by_default',intval($_POST['twitter-default']));
-               set_pconfig(local_user(), 'twitter', 'mirror_posts', intval($_POST['twitter-mirror']));
-               set_pconfig(local_user(), 'twitter', 'import', intval($_POST['twitter-import']));
-               set_pconfig(local_user(), 'twitter', 'create_user', intval($_POST['twitter-create_user']));
-
-               if (!intval($_POST['twitter-mirror']))
-                       del_pconfig(local_user(),'twitter','lastid');
-
-               info(t('Twitter settings updated.') . EOL);
-       }}
+               if (isset($_POST['twitter-pin'])) {
+                       //  if the user supplied us with a PIN from Twitter, let the magic of OAuth happen
+                       logger('got a Twitter PIN');
+                       $ckey    = Config::get('twitter', 'consumerkey');
+                       $csecret = Config::get('twitter', 'consumersecret');
+                       //  the token and secret for which the PIN was generated were hidden in the settings
+                       //  form as token and token2, we need a new connection to Twitter using these token
+                       //  and secret to request a Access Token with the PIN
+                       try {
+                               if (empty($_POST['twitter-pin'])) {
+                                       throw new Exception(L10n::t('You submitted an empty PIN, please Sign In with Twitter again to get a new one.'));
+                               }
+
+                               $connection = new TwitterOAuth($ckey, $csecret, $_POST['twitter-token'], $_POST['twitter-token2']);
+                               $token = $connection->oauth("oauth/access_token", ["oauth_verifier" => $_POST['twitter-pin']]);
+                               //  ok, now that we have the Access Token, save them in the user config
+                               PConfig::set(local_user(), 'twitter', 'oauthtoken', $token['oauth_token']);
+                               PConfig::set(local_user(), 'twitter', 'oauthsecret', $token['oauth_token_secret']);
+                               PConfig::set(local_user(), 'twitter', 'post', 1);
+                       } catch(Exception $e) {
+                               info($e->getMessage());
+                       }
+                       //  reload the Addon Settings page, if we don't do it see Bug #42
+                       goaway('settings/connectors');
+               } else {
+                       //  if no PIN is supplied in the POST variables, the user has changed the setting
+                       //  to post a tweet for every new __public__ posting to the wall
+                       PConfig::set(local_user(), 'twitter', 'post', intval($_POST['twitter-enable']));
+                       PConfig::set(local_user(), 'twitter', 'post_by_default', intval($_POST['twitter-default']));
+                       PConfig::set(local_user(), 'twitter', 'mirror_posts', intval($_POST['twitter-mirror']));
+                       PConfig::set(local_user(), 'twitter', 'import', intval($_POST['twitter-import']));
+                       PConfig::set(local_user(), 'twitter', 'create_user', intval($_POST['twitter-create_user']));
+
+                       if (!intval($_POST['twitter-mirror'])) {
+                               PConfig::delete(local_user(), 'twitter', 'lastid');
+                       }
+
+                       info(L10n::t('Twitter settings updated.') . EOL);
+               }
+       }
 }
 function twitter_settings(&$a,&$s) {
        if(! local_user())
@@ -231,71 +261,58 @@ function twitter_settings(&$a,&$s) {
         * 2) If no OAuthtoken & stuff is present, generate button to get some
         * 3) Checkbox for "Send public notices (140 chars only)
         */
-       $ckey    = get_config('twitter', 'consumerkey' );
-       $csecret = get_config('twitter', 'consumersecret' );
-       $otoken  = get_pconfig(local_user(), 'twitter', 'oauthtoken'  );
-       $osecret = get_pconfig(local_user(), 'twitter', 'oauthsecret' );
-       $enabled = get_pconfig(local_user(), 'twitter', 'post');
-       $checked = (($enabled) ? ' checked="checked" ' : '');
-       $defenabled = get_pconfig(local_user(),'twitter','post_by_default');
-       $defchecked = (($defenabled) ? ' checked="checked" ' : '');
-       $mirrorenabled = get_pconfig(local_user(),'twitter','mirror_posts');
-       $mirrorchecked = (($mirrorenabled) ? ' checked="checked" ' : '');
-       $importenabled = get_pconfig(local_user(),'twitter','import');
-       $importchecked = (($importenabled) ? ' checked="checked" ' : '');
-       $create_userenabled = get_pconfig(local_user(),'twitter','create_user');
-       $create_userchecked = (($create_userenabled) ? ' checked="checked" ' : '');
+       $ckey    = Config::get('twitter', 'consumerkey');
+       $csecret = Config::get('twitter', 'consumersecret');
+       $otoken  = PConfig::get(local_user(), 'twitter', 'oauthtoken');
+       $osecret = PConfig::get(local_user(), 'twitter', 'oauthsecret');
+
+       $enabled            = intval(PConfig::get(local_user(), 'twitter', 'post'));
+       $defenabled         = intval(PConfig::get(local_user(), 'twitter', 'post_by_default'));
+       $mirrorenabled      = intval(PConfig::get(local_user(), 'twitter', 'mirror_posts'));
+       $importenabled      = intval(PConfig::get(local_user(), 'twitter', 'import'));
+       $create_userenabled = intval(PConfig::get(local_user(), 'twitter', 'create_user'));
 
        $css = (($enabled) ? '' : '-disabled');
 
        $s .= '<span id="settings_twitter_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_twitter_expanded\'); openClose(\'settings_twitter_inflated\');">';
-       $s .= '<img class="connector'.$css.'" src="images/twitter.png" /><h3 class="connector">'. t('Twitter Import/Export/Mirror').'</h3>';
+       $s .= '<img class="connector' . $css . '" src="images/twitter.png" /><h3 class="connector">' . L10n::t('Twitter Import/Export/Mirror') . '</h3>';
        $s .= '</span>';
        $s .= '<div id="settings_twitter_expanded" class="settings-block" style="display: none;">';
        $s .= '<span class="fakelink" onclick="openClose(\'settings_twitter_expanded\'); openClose(\'settings_twitter_inflated\');">';
-       $s .= '<img class="connector'.$css.'" src="images/twitter.png" /><h3 class="connector">'. t('Twitter Import/Export/Mirror').'</h3>';
+       $s .= '<img class="connector' . $css . '" src="images/twitter.png" /><h3 class="connector">' . L10n::t('Twitter Import/Export/Mirror') . '</h3>';
        $s .= '</span>';
 
-       if ( (!$ckey) && (!$csecret) ) {
-               /***
-                * no global consumer keys
+       if ((!$ckey) && (!$csecret)) {
+               /* no global consumer keys
                 * display warning and skip personal config
                 */
-               $s .= '<p>'. t('No consumer key pair for Twitter found. Please contact your site administrator.') .'</p>';
+               $s .= '<p>' . L10n::t('No consumer key pair for Twitter found. Please contact your site administrator.') . '</p>';
        } else {
-               /***
-                * ok we have a consumer key pair now look into the OAuth stuff
-                */
-               if ( (!$otoken) && (!$osecret) ) {
-                       /***
-                        * the user has not yet connected the account to twitter...
+               // ok we have a consumer key pair now look into the OAuth stuff
+               if ((!$otoken) && (!$osecret)) {
+                       /* the user has not yet connected the account to twitter...
                         * get a temporary OAuth key/secret pair and display a button with
                         * which the user can request a PIN to connect the account to a
                         * account at Twitter.
                         */
-                       require_once('library/twitteroauth.php');
                        $connection = new TwitterOAuth($ckey, $csecret);
-                       $request_token = $connection->getRequestToken();
-                       $token = $request_token['oauth_token'];
-                       /***
-                        *  make some nice form
-                        */
-                       $s .= '<p>'. t('At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter.') .'</p>';
-                       $s .= '<a href="'.$connection->getAuthorizeURL($token).'" target="_twitter"><img src="addon/twitter/lighter.png" alt="'.t('Log in with Twitter').'"></a>';
+                       $result = $connection->oauth('oauth/request_token', ['oauth_callback' => 'oob']);
+
+                       $s .= '<p>' . L10n::t('At this Friendica instance the Twitter addon was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter.') . '</p>';
+                       $s .= '<a href="' . $connection->url('oauth/authorize', ['oauth_token' => $result['oauth_token']]) . '" target="_twitter"><img src="addon/twitter/lighter.png" alt="' . L10n::t('Log in with Twitter') . '"></a>';
                        $s .= '<div id="twitter-pin-wrapper">';
-                       $s .= '<label id="twitter-pin-label" for="twitter-pin">'. t('Copy the PIN from Twitter here') .'</label>';
+                       $s .= '<label id="twitter-pin-label" for="twitter-pin">' . L10n::t('Copy the PIN from Twitter here') . '</label>';
                        $s .= '<input id="twitter-pin" type="text" name="twitter-pin" />';
-                       $s .= '<input id="twitter-token" type="hidden" name="twitter-token" value="'.$token.'" />';
-                       $s .= '<input id="twitter-token2" type="hidden" name="twitter-token2" value="'.$request_token['oauth_token_secret'].'" />';
-           $s .= '</div><div class="clear"></div>';
-           $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="twitter-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+                       $s .= '<input id="twitter-token" type="hidden" name="twitter-token" value="' . $result['oauth_token'] . '" />';
+                       $s .= '<input id="twitter-token2" type="hidden" name="twitter-token2" value="' . $result['oauth_token_secret'] . '" />';
+                       $s .= '</div><div class="clear"></div>';
+                       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="twitter-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
                } else {
                        /***
                         *  we have an OAuth key / secret pair for the user
                         *  so let's give a chance to disable the postings to Twitter
                         */
-                       require_once('library/twitteroauth.php');
-                       $connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
+                       $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
                        $details = $connection->get('account/verify_credentials');
                        $s .= '<div id="twitter-info" ><img id="twitter-avatar" src="'.$details->profile_image_url.'" /><p id="twitter-info-block">'. t('Currently connected to: ') .'<a href="https://twitter.com/'.$details->screen_name.'" target="_twitter">'.$details->screen_name.'</a><br /><em>'.$details->description.'</em></p></div>';
                        $s .= '<p>'. t('If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry.') .'</p>';
@@ -310,24 +327,43 @@ function twitter_settings(&$a,&$s) {
                        $s .= '<input id="twitter-default" type="checkbox" name="twitter-default" value="1" ' . $defchecked . '/>';
                        $s .= '<div class="clear"></div>';
 
-                       $s .= '<label id="twitter-mirror-label" for="twitter-mirror">'.t('Mirror all posts from twitter that are no replies').'</label>';
-                       $s .= '<input id="twitter-mirror" type="checkbox" name="twitter-mirror" value="1" '. $mirrorchecked . '/>';
+                       $field_checkbox = get_markup_template('field_checkbox.tpl');
+
+                       $s .= '<div id="twitter-info" >
+                               <p>' . L10n::t('Currently connected to: ') . '<a href="https://twitter.com/' . $details->screen_name . '" target="_twitter">' . $details->screen_name . '</a>
+                                       <button type="submit" name="twitter-disconnect" value="1">' . L10n::t('Disconnect') . '</button>
+                               </p>
+                               <p id="twitter-info-block">
+                                       <a href="https://twitter.com/' . $details->screen_name . '" target="_twitter"><img id="twitter-avatar" src="' . $details->profile_image_url . '" /></a>
+                                       <em>' . $details->description . '</em>
+                               </p>
+                       </div>';
                        $s .= '<div class="clear"></div>';
                        $s .= '</div>';
 
-                       $s .= '<label id="twitter-import-label" for="twitter-import">'.t('Import the remote timeline').'</label>';
-                       $s .= '<input id="twitter-import" type="checkbox" name="twitter-import" value="1" '. $importchecked . '/>';
-                       $s .= '<div class="clear"></div>';
+                       $s .= replace_macros($field_checkbox, [
+                               '$field' => ['twitter-enable', L10n::t('Allow posting to Twitter'), $enabled, L10n::t('If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry.')]
+                       ]);
+                       if ($a->user['hidewall']) {
+                               $s .= '<p>' . L10n::t('<strong>Note</strong>: Due to your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted.') . '</p>';
+                       }
+                       $s .= replace_macros($field_checkbox, [
+                               '$field' => ['twitter-default', L10n::t('Send public postings to Twitter by default'), $defenabled, '']
+                       ]);
+                       $s .= replace_macros($field_checkbox, [
+                               '$field' => ['twitter-mirror', L10n::t('Mirror all posts from twitter that are no replies'), $mirrorenabled, '']
+                       ]);
+                       $s .= replace_macros($field_checkbox, [
+                               '$field' => ['twitter-import', L10n::t('Import the remote timeline'), $importenabled, '']
+                       ]);
+                       $s .= replace_macros($field_checkbox, [
+                               '$field' => ['twitter-create_user', L10n::t('Automatically create contacts'), $create_userenabled, '']
+                       ]);
 
                        $s .= '<label id="twitter-create_user-label" for="twitter-create_user">'.t('Automatically create contacts').'</label>';
                        $s .= '<input id="twitter-create_user" type="checkbox" name="twitter-create_user" value="1" '. $create_userchecked . '/>';
                        $s .= '<div class="clear"></div>';
-
-                       $s .= '<div id="twitter-disconnect-wrapper">';
-                       $s .= '<label id="twitter-disconnect-label" for="twitter-disconnect">'. t('Clear OAuth configuration') .'</label>';
-                       $s .= '<input id="twitter-disconnect" type="checkbox" name="twitter-disconnect" value="1" />';
-                       $s .= '</div><div class="clear"></div>';
-                       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="twitter-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
+                       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="twitter-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div>';
                }
        }
        $s .= '</div><div class="clear"></div>';
@@ -365,16 +401,7 @@ function twitter_post_local(&$a, &$b) {
 
 function twitter_action($a, $uid, $pid, $action) {
 
-       $ckey    = get_config('twitter', 'consumerkey');
-       $csecret = get_config('twitter', 'consumersecret');
-       $otoken  = get_pconfig($uid, 'twitter', 'oauthtoken');
-       $osecret = get_pconfig($uid, 'twitter', 'oauthsecret');
-
-       require_once("addon/twitter/codebird.php");
-
-       $cb = \Codebird\Codebird::getInstance();
-       $cb->setConsumerKey($ckey, $csecret);
-       $cb->setToken($otoken, $osecret);
+       $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
 
        $post = array('id' => $pid);
 
@@ -382,37 +409,35 @@ function twitter_action($a, $uid, $pid, $action) {
 
        switch ($action) {
                case "delete":
-                       // To-Do: $result = $cb->statuses_destroy($post);
+                       // To-Do: $result = $connection->post('statuses/destroy', $post);
                        break;
                case "like":
-                       $result = $cb->favorites_create($post);
+                       $result = $connection->post('favorites/create', $post);
                        break;
                case "unlike":
-                       $result = $cb->favorites_destroy($post);
+                       $result = $connection->post('favorites/destroy', $post);
                        break;
        }
        logger("twitter_action '".$action."' send, result: " . print_r($result, true), LOGGER_DEBUG);
 }
 
-function twitter_post_hook(&$a,&$b) {
-
-       /**
-        * Post to Twitter
-        */
-
-       require_once("include/network.php");
-
-       if (!get_pconfig($b["uid"],'twitter','import')) {
-               if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited']))
-                       return;
+function twitter_post_hook(App $a, &$b)
+{
+       // Post to Twitter
+       if (!PConfig::get($b["uid"], 'twitter', 'import')
+               && ($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited']))) {
+               return;
        }
 
        if($b['parent'] != $b['id']) {
                logger("twitter_post_hook: parameter ".print_r($b, true), LOGGER_DATA);
 
                // Looking if its a reply to a twitter post
-               if ((substr($b["parent-uri"], 0, 9) != "twitter::") && (substr($b["extid"], 0, 9) != "twitter::") && (substr($b["thr-parent"], 0, 9) != "twitter::")) {
-                       logger("twitter_post_hook: no twitter post ".$b["parent"]);
+               if ((substr($b["parent-uri"], 0, 9) != "twitter::")
+                       && (substr($b["extid"], 0, 9) != "twitter::")
+                       && (substr($b["thr-parent"], 0, 9) != "twitter::"))
+               {
+                       logger("twitter_post_hook: no twitter post " . $b["parent"]);
                        return;
                }
 
@@ -448,12 +473,14 @@ function twitter_post_hook(&$a,&$b) {
        if (($b['verb'] == ACTIVITY_POST) && $b['deleted'])
                twitter_action($a, $b["uid"], substr($orig_post["uri"], 9), "delete");
 
-       if($b['verb'] == ACTIVITY_LIKE) {
-               logger("twitter_post_hook: parameter 2 ".substr($b["thr-parent"], 9), LOGGER_DEBUG);
-               if ($b['deleted'])
+       if ($b['verb'] == ACTIVITY_LIKE) {
+               logger("twitter_post_hook: parameter 2 " . substr($b["thr-parent"], 9), LOGGER_DEBUG);
+               if ($b['deleted']) {
                        twitter_action($a, $b["uid"], substr($b["thr-parent"], 9), "unlike");
-               else
+               } else {
                        twitter_action($a, $b["uid"], substr($b["thr-parent"], 9), "like");
+               }
+
                return;
        }
 
@@ -484,17 +511,15 @@ function twitter_post_hook(&$a,&$b) {
                if (twitter_is_retweet($a, $b['uid'], $b['body']))
                        return;
 
-               require_once('library/twitteroauth.php');
-               require_once('include/bbcode.php');
-               $tweet = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
+               $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
 
-               $max_char = 140;
-               require_once("include/plaintext.php");
-               $msgarr = plaintext($a, $b, $max_char, true, 8);
+               $max_char = 280;
+               $msgarr = BBCode::toPlaintext($b, $max_char, true, 8);
                $msg = $msgarr["text"];
 
-               if (($msg == "") && isset($msgarr["title"]))
-                       $msg = shortenmsg($msgarr["title"], $max_char - 50);
+               if (($msg == "") && isset($msgarr["title"])) {
+                       $msg = Plaintext::shorten($msgarr["title"], $max_char - 50);
+               }
 
                $image = "";
 
@@ -505,29 +530,16 @@ function twitter_post_hook(&$a,&$b) {
                        $image = $msgarr["image"];
 
                // and now tweet it :-)
-               if(strlen($msg) && ($image != "")) {
-                       $img_str = fetch_url($image);
-
-                       $tempfile = tempnam(get_temppath(), "cache");
-                       file_put_contents($tempfile, $img_str);
+               if (strlen($msg) && ($image != "")) {
+                       $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
+                       $media = $connection->upload('media/upload', ['media' => $image]);
 
-                       // Twitter had changed something so that the old library doesn't work anymore
-                       // so we are using a new library for twitter
-                       // To-Do:
-                       // Switching completely to this library with all functions
-                       require_once("addon/twitter/codebird.php");
-
-                       $cb = \Codebird\Codebird::getInstance();
-                       $cb->setConsumerKey($ckey, $csecret);
-                       $cb->setToken($otoken, $osecret);
-
-                       $post = array('status' => $msg, 'media[]' => $tempfile);
+                       $post = ['status' => $msg, 'media_ids' => $media->media_id_string];
 
                        if ($iscomment)
                                $post["in_reply_to_status_id"] = substr($orig_post["uri"], 9);
 
-                       $result = $cb->statuses_updateWithMedia($post);
-                       unlink($tempfile);
+                       $result = $connection->post('statuses/update', $post);
 
                        logger('twitter_post_with_media send, result: ' . print_r($result, true), LOGGER_DEBUG);
 
@@ -541,23 +553,32 @@ function twitter_post_hook(&$a,&$b) {
                                $msg .= " ".$image;
                                $image = "";
                        } elseif ($iscomment) {
-                               logger('twitter_post: Update extid '.$result->id_str." for post id ".$b['id']);
-                               q("UPDATE `item` SET `extid` = '%s', `body` = '%s' WHERE `id` = %d",
-                                       dbesc("twitter::".$result->id_str),
-                                       dbesc($result->text),
-                                       intval($b['id'])
-                               );
+                               logger('twitter_post: Update extid ' . $result->id_str . " for post id " . $b['id']);
+                               Item::update(['extid' => "twitter::" . $result->id_str, 'body' => $result->text], ['id' => $b['id']]);
                        }
                }
 
-               if(strlen($msg) && ($image == "")) {
+               if (strlen($msg) && ($image == "")) {
+// -----------------
+                       $max_char = 280;
+                       $msgarr = BBCode::toPlaintext($b, $max_char, true, 8);
+                       $msg = $msgarr["text"];
+
+                       if (($msg == "") && isset($msgarr["title"])) {
+                               $msg = Plaintext::shorten($msgarr["title"], $max_char - 50);
+                       }
+
+                       if (isset($msgarr["url"])) {
+                               $msg .= "\n" . $msgarr["url"];
+                       }
+// -----------------
                        $url = 'statuses/update';
                        $post = array('status' => $msg);
 
                        if ($iscomment)
                                $post["in_reply_to_status_id"] = substr($orig_post["uri"], 9);
 
-                       $result = $tweet->post($url, $post);
+                       $result = $connection->post($url, $post);
                        logger('twitter_post send, result: ' . print_r($result, true), LOGGER_DEBUG);
 
                        if ($result->source)
@@ -570,45 +591,39 @@ function twitter_post_hook(&$a,&$b) {
                                if (count($r))
                                        $a->contact = $r[0]["id"];
 
-                               $s = serialize(array('url' => $url, 'item' => $b['id'], 'post' => $post));
-                               require_once('include/queue_fn.php');
-                               add_to_queue($a->contact,NETWORK_TWITTER,$s);
-                               notice(t('Twitter post failed. Queued for retry.').EOL);
+                               $s = serialize(['url' => $url, 'item' => $b['id'], 'post' => $post]);
+
+                               Queue::add($a->contact, NETWORK_TWITTER, $s);
+                               notice(L10n::t('Twitter post failed. Queued for retry.') . EOL);
                        } elseif ($iscomment) {
-                               logger('twitter_post: Update extid '.$result->id_str." for post id ".$b['id']);
-                               q("UPDATE `item` SET `extid` = '%s' WHERE `id` = %d",
-                                       dbesc("twitter::".$result->id_str),
-                                       intval($b['id'])
-                               );
-                               //q("UPDATE `item` SET `extid` = '%s', `body` = '%s' WHERE `id` = %d",
-                               //      dbesc("twitter::".$result->id_str),
-                               //      dbesc($result->text),
-                               //      intval($b['id'])
-                               //);
+                               logger('twitter_post: Update extid ' . $result->id_str . " for post id " . $b['id']);
+                               Item::update(['extid' => "twitter::" . $result->id_str], ['id' => $b['id']]);
                        }
                }
        }
 }
 
-function twitter_plugin_admin_post(&$a){
-       $consumerkey    =       ((x($_POST,'consumerkey'))              ? notags(trim($_POST['consumerkey']))   : '');
-       $consumersecret =       ((x($_POST,'consumersecret'))   ? notags(trim($_POST['consumersecret'])): '');
-       $applicationname = ((x($_POST, 'applicationname')) ? notags(trim($_POST['applicationname'])):'');
-       set_config('twitter','consumerkey',$consumerkey);
-       set_config('twitter','consumersecret',$consumersecret);
-       //set_config('twitter','application_name',$applicationname);
-       info( t('Settings updated.'). EOL );
+function twitter_addon_admin_post(App $a)
+{
+       $consumerkey    = x($_POST, 'consumerkey')    ? notags(trim($_POST['consumerkey']))    : '';
+       $consumersecret = x($_POST, 'consumersecret') ? notags(trim($_POST['consumersecret'])) : '';
+       Config::set('twitter', 'consumerkey', $consumerkey);
+       Config::set('twitter', 'consumersecret', $consumersecret);
+       info(L10n::t('Settings updated.') . EOL);
 }
 function twitter_plugin_admin(&$a, &$o){
        $t = get_markup_template( "admin.tpl", "addon/twitter/" );
 
-       $o = replace_macros($t, array(
-               '$submit' => t('Save Settings'),
-                                                               // name, label, value, help, [extra values]
-               '$consumerkey' => array('consumerkey', t('Consumer key'),  get_config('twitter', 'consumerkey' ), ''),
-               '$consumersecret' => array('consumersecret', t('Consumer secret'),  get_config('twitter', 'consumersecret' ), ''),
-               //'$applicationname' => array('applicationname', t('Name of the Twitter Application'), get_config('twitter','application_name'),t('Set this to the exact name you gave the app on twitter.com/apps to avoid mirroring postings from ~friendica back to ~friendica'))
-       ));
+function twitter_addon_admin(App $a, &$o)
+{
+       $t = get_markup_template("admin.tpl", "addon/twitter/");
+
+       $o = replace_macros($t, [
+               '$submit' => L10n::t('Save Settings'),
+               // name, label, value, help, [extra values]
+               '$consumerkey' => ['consumerkey', L10n::t('Consumer key'), Config::get('twitter', 'consumerkey'), ''],
+               '$consumersecret' => ['consumersecret', L10n::t('Consumer secret'), Config::get('twitter', 'consumersecret'), ''],
+       ]);
 }
 
 function twitter_cron($a,$b) {
@@ -635,11 +650,12 @@ function twitter_cron($a,$b) {
                }
        }
 
-       $abandon_days = intval(get_config('system','account_abandon_days'));
-       if ($abandon_days < 1)
+       $abandon_days = intval(Config::get('system', 'account_abandon_days'));
+       if ($abandon_days < 1) {
                $abandon_days = 0;
+       }
 
-       $abandon_limit = date("Y-m-d H:i:s", time() - $abandon_days * 86400);
+       $abandon_limit = date(DateTimeFormat::MYSQL, time() - $abandon_days * 86400);
 
        $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'twitter' AND `k` = 'import' AND `v` = '1'");
        if(count($r)) {
@@ -699,10 +715,10 @@ function twitter_expire($a,$b) {
        logger('twitter_expire: expire_start');
 
        $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'twitter' AND `k` = 'import' AND `v` = '1' ORDER BY RAND()");
-       if(count($r)) {
-               foreach($r as $rr) {
-                       logger('twitter_expire: user '.$rr['uid']);
-                       item_expire($rr['uid'], $days, NETWORK_TWITTER, true);
+       if (count($r)) {
+               foreach ($r as $rr) {
+                       logger('twitter_expire: user ' . $rr['uid']);
+                       Item::expire($rr['uid'], $days, NETWORK_TWITTER, true);
                }
        }
 
@@ -714,8 +730,7 @@ function twitter_prepare_body(&$a,&$b) {
                return;
 
        if ($b["preview"]) {
-               $max_char = 140;
-               require_once("include/plaintext.php");
+               $max_char = 280;
                $item = $b["item"];
                $item["plink"] = $a->get_baseurl()."/display/".$a->user["nickname"]."/".$item["parent"];
 
@@ -734,8 +749,7 @@ function twitter_prepare_body(&$a,&$b) {
                                $item["body"] = $nickname." ".$item["body"];
                }
 
-
-               $msgarr = plaintext($a, $item, $max_char, true, 8);
+               $msgarr = BBCode::toPlaintext($item, $max_char, true, 8);
                $msg = $msgarr["text"];
 
                if (isset($msgarr["url"]) && ($msgarr["type"] != "photo"))
@@ -770,8 +784,14 @@ function twitter_do_mirrorpost($a, $uid, $post) {
                // We don't support nested shares, so we mustn't show quotes as shares on retweets
                $item = twitter_createpost($a, $uid, $post->retweeted_status, array('id' => 0), false, false, true);
 
-               $datarray['body'] = "\n".share_header($item['author-name'], $item['author-link'], $item['author-avatar'], "",
-                                       $item['created'], $item['plink']);
+               $datarray['body'] = "\n" . share_header(
+                       $item['author-name'],
+                       $item['author-link'],
+                       $item['author-avatar'],
+                       "",
+                       $item['created'],
+                       $item['plink']
+               );
 
                $datarray['body'] .= $item['body'].'[/share]';
        } else {
@@ -812,8 +832,7 @@ function twitter_fetchtimeline($a, $uid) {
        require_once('include/items.php');
        require_once('mod/share.php');
 
-       require_once('library/twitteroauth.php');
-       $connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
+       $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
 
        $parameters = array("exclude_replies" => true, "trim_user" => false, "contributor_details" => true, "include_rts" => true, "tweet_mode" => "extended");
 
@@ -863,10 +882,8 @@ function twitter_queue_hook(&$a,&$b) {
        if(! count($qi))
                return;
 
-       require_once('include/queue_fn.php');
-
-       foreach($qi as $x) {
-               if($x['network'] !== NETWORK_TWITTER)
+       foreach ($qi as $x) {
+               if ($x['network'] !== NETWORK_TWITTER) {
                        continue;
 
                logger('twitter_queue: run');
@@ -893,14 +910,8 @@ function twitter_queue_hook(&$a,&$b) {
 
                        $z = unserialize($x['content']);
 
-                       require_once("addon/twitter/codebird.php");
-
-                       $cb = \Codebird\Codebird::getInstance();
-                       $cb->setConsumerKey($ckey, $csecret);
-                       $cb->setToken($otoken, $osecret);
-
-                       if ($z['url'] == "statuses/update")
-                               $result = $cb->statuses_update($z['post']);
+                       $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
+                       $result = $connection->post($z['url'], $z['post']);
 
                        logger('twitter_queue: post result: ' . print_r($result, true), LOGGER_DEBUG);
 
@@ -908,14 +919,14 @@ function twitter_queue_hook(&$a,&$b) {
                                logger('twitter_queue: Send to Twitter failed: "' . print_r($result->errors, true) . '"');
                        else {
                                $success = true;
-                               remove_queue_item($x['id']);
+                               Queue::removeItem($x['id']);
                        }
                } else
                        logger("twitter_queue: Error getting tokens for user ".$user['uid']);
 
                if (!$success) {
                        logger('twitter_queue: delayed');
-                       update_queue_time($x['id']);
+                       Queue::updateTime($x['id']);
                }
        }
 }
@@ -946,7 +957,8 @@ function twitter_fetch_contact($uid, $contact, $create_user) {
                        "addr" => $contact->screen_name."@twitter.com", "generation" => 2));
 
        $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `alias` = '%s' LIMIT 1",
-               intval($uid), dbesc("twitter::".$contact->id_str));
+               intval($uid),
+               dbesc("twitter::" . $contact->id_str));
 
        if(!count($r) && !$create_user)
                return(0);
@@ -963,9 +975,9 @@ function twitter_fetch_contact($uid, $contact, $create_user) {
                                        `location`, `about`, `writable`, `blocked`, `readonly`, `pending`)
                                        VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', %d, 0, 0, 0)",
                        intval($uid),
-                       dbesc(datetime_convert()),
-                       dbesc("https://twitter.com/".$contact->screen_name),
-                       dbesc(normalise_link("https://twitter.com/".$contact->screen_name)),
+                       dbesc(DateTimeFormat::utcNow()),
+                       dbesc("https://twitter.com/" . $contact->screen_name),
+                       dbesc(normalise_link("https://twitter.com/" . $contact->screen_name)),
                        dbesc($contact->screen_name."@twitter.com"),
                        dbesc("twitter::".$contact->id_str),
                        dbesc(''),
@@ -1015,17 +1027,16 @@ function twitter_fetch_contact($uid, $contact, $create_user) {
                                dbesc($photos[0]),
                                dbesc($photos[1]),
                                dbesc($photos[2]),
-                               dbesc(datetime_convert()),
-                               dbesc(datetime_convert()),
-                               dbesc(datetime_convert()),
+                               dbesc(DateTimeFormat::utcNow()),
+                               dbesc(DateTimeFormat::utcNow()),
+                               dbesc(DateTimeFormat::utcNow()),
                                intval($contact_id)
                        );
                }
        } else {
                // update profile photos once every two weeks as we have no notification of when they change.
-
-               //$update_photo = (($r[0]['avatar-date'] < datetime_convert('','','now -2 days')) ? true : false);
-               $update_photo = ($r[0]['avatar-date'] < datetime_convert('','','now -12 hours'));
+               //$update_photo = (($r[0]['avatar-date'] < DateTimeFormat::convert('now -2 days', '', '', )) ? true : false);
+               $update_photo = ($r[0]['avatar-date'] < DateTimeFormat::utc('now -12 hours'));
 
                // check that we have all the photos, this has been known to fail on occasion
 
@@ -1055,9 +1066,9 @@ function twitter_fetch_contact($uid, $contact, $create_user) {
                                        dbesc($photos[0]),
                                        dbesc($photos[1]),
                                        dbesc($photos[2]),
-                                       dbesc(datetime_convert()),
-                                       dbesc(datetime_convert()),
-                                       dbesc(datetime_convert()),
+                                       dbesc(DateTimeFormat::utcNow()),
+                                       dbesc(DateTimeFormat::utcNow()),
+                                       dbesc(DateTimeFormat::utcNow()),
                                        dbesc("https://twitter.com/".$contact->screen_name),
                                        dbesc(normalise_link("https://twitter.com/".$contact->screen_name)),
                                        dbesc($contact->screen_name."@twitter.com"),
@@ -1074,17 +1085,12 @@ function twitter_fetch_contact($uid, $contact, $create_user) {
        return($r[0]["id"]);
 }
 
-function twitter_fetchuser($a, $uid, $screen_name = "", $user_id = "") {
-       $ckey    = get_config('twitter', 'consumerkey');
-       $csecret = get_config('twitter', 'consumersecret');
-       $otoken  = get_pconfig($uid, 'twitter', 'oauthtoken');
-       $osecret = get_pconfig($uid, 'twitter', 'oauthsecret');
-
-       require_once("addon/twitter/codebird.php");
-
-       $cb = \Codebird\Codebird::getInstance();
-       $cb->setConsumerKey($ckey, $csecret);
-       $cb->setToken($otoken, $osecret);
+function twitter_fetchuser(App $a, $uid, $screen_name = "", $user_id = "")
+{
+       $ckey = Config::get('twitter', 'consumerkey');
+       $csecret = Config::get('twitter', 'consumersecret');
+       $otoken = PConfig::get($uid, 'twitter', 'oauthtoken');
+       $osecret = PConfig::get($uid, 'twitter', 'oauthsecret');
 
        $r = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
                intval($uid));
@@ -1103,7 +1109,8 @@ function twitter_fetchuser($a, $uid, $screen_name = "", $user_id = "") {
                $parameters["user_id"] = $user_id;
 
        // Fetching user data
-       $user = $cb->users_show($parameters);
+       $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
+       $user = $connection->get('users/show', $parameters);
 
        if (!is_object($user))
                return;
@@ -1113,13 +1120,23 @@ function twitter_fetchuser($a, $uid, $screen_name = "", $user_id = "") {
        return $contact_id;
 }
 
-function twitter_expand_entities($a, $body, $item, $no_tags = false, $picture) {
-       require_once("include/oembed.php");
-       require_once("include/network.php");
+function twitter_expand_entities(App $a, $body, $item, $picture)
+{
+       $plain = $body;
 
-       $tags = "";
+       $tags_arr = [];
 
-       $plain = $body;
+       foreach ($item->entities->hashtags AS $hashtag) {
+               $url = "#[url=" . $a->get_baseurl() . "/search?tag=" . rawurlencode($hashtag->text) . "]" . $hashtag->text . "[/url]";
+               $tags_arr["#" . $hashtag->text] = $url;
+               $body = str_replace("#" . $hashtag->text, $url, $body);
+       }
+
+       foreach ($item->entities->user_mentions AS $mention) {
+               $url = "@[url=https://twitter.com/" . rawurlencode($mention->screen_name) . "]" . $mention->screen_name . "[/url]";
+               $tags_arr["@" . $mention->screen_name] = $url;
+               $body = str_replace("@" . $mention->screen_name, $url, $body);
+       }
 
        if (isset($item->entities->urls)) {
                $type = "";
@@ -1127,13 +1144,11 @@ function twitter_expand_entities($a, $body, $item, $no_tags = false, $picture) {
                $footerlink = "";
                $footer = "";
 
-               foreach ($item->entities->urls AS $url) {
-
+               foreach ($item->entities->urls as $url) {
                        $plain = str_replace($url->url, '', $plain);
 
                        if ($url->url && $url->expanded_url && $url->display_url) {
-
-                               $expanded_url = original_url($url->expanded_url);
+                               $expanded_url = Network::finalUrl($url->expanded_url);
 
                                $oembed_data = oembed_fetch_url($expanded_url);
 
@@ -1159,12 +1174,10 @@ function twitter_expand_entities($a, $body, $item, $no_tags = false, $picture) {
                                                        "[url=".$expanded_url."][img]".$oembed_data->url."[/img][/url]",
                                                        $body);
                                        //$dontincludemedia = true;
-                               } elseif ($oembed_data->type != "link")
-                                       $body = str_replace($url->url,
-                                                       "[url=".$expanded_url."]".$expanded_url."[/url]",
-                                                       $body);
-                               else {
-                                       $img_str = fetch_url($expanded_url, true, $redirects, 4);
+                               } elseif ($oembed_data->type != "link") {
+                                       $body = str_replace($url->url, "[url=" . $expanded_url . "]" . $expanded_url . "[/url]", $body);
+                               } else {
+                                       $img_str = Network::fetchUrl($expanded_url, true, $redirects, 4);
 
                                        $tempfile = tempnam(get_temppath(), "cache");
                                        file_put_contents($tempfile, $img_str);
@@ -1202,65 +1215,50 @@ function twitter_expand_entities($a, $body, $item, $no_tags = false, $picture) {
                        $body .= "\n\n[img]".$picture."[/img]\n";
                elseif (($footer == "") && ($picture == ""))
                        $body = add_page_info_to_body($body);
-
-               if ($no_tags)
-                       return array("body" => $body, "tags" => "", "plain" => $plain);
-
-               $tags_arr = array();
-
-               foreach ($item->entities->hashtags AS $hashtag) {
-                       $url = "#[url=".$a->get_baseurl()."/search?tag=".rawurlencode($hashtag->text)."]".$hashtag->text."[/url]";
-                       $tags_arr["#".$hashtag->text] = $url;
-                       $body = str_replace("#".$hashtag->text, $url, $body);
                }
+       }
 
-               foreach ($item->entities->user_mentions AS $mention) {
-                       $url = "@[url=https://twitter.com/".rawurlencode($mention->screen_name)."]".$mention->screen_name."[/url]";
-                       $tags_arr["@".$mention->screen_name] = $url;
-                       $body = str_replace("@".$mention->screen_name, $url, $body);
-               }
+       // it seems as if the entities aren't always covering all mentions. So the rest will be checked here
+       $tags = get_tags($body);
 
-               // it seems as if the entities aren't always covering all mentions. So the rest will be checked here
-               $tags = get_tags($body);
+       if (count($tags)) {
+               foreach ($tags as $tag) {
+                       if (strstr(trim($tag), " ")) {
+                               continue;
+                       }
 
-               if(count($tags)) {
-                       foreach($tags as $tag) {
-                               if (strstr(trim($tag), " "))
+                       if (strpos($tag, '#') === 0) {
+                               if (strpos($tag, '[url=')) {
                                        continue;
 
-                               if(strpos($tag,'#') === 0) {
-                                       if(strpos($tag,'[url='))
-                                               continue;
-
-                                       // don't link tags that are already embedded in links
-
-                                       if(preg_match('/\[(.*?)' . preg_quote($tag,'/') . '(.*?)\]/',$body))
-                                               continue;
-                                       if(preg_match('/\[(.*?)\]\((.*?)' . preg_quote($tag,'/') . '(.*?)\)/',$body))
-                                               continue;
+                               // don't link tags that are already embedded in links
+                               if (preg_match('/\[(.*?)' . preg_quote($tag, '/') . '(.*?)\]/', $body)) {
+                                       continue;
+                               }
+                               if (preg_match('/\[(.*?)\]\((.*?)' . preg_quote($tag, '/') . '(.*?)\)/', $body)) {
+                                       continue;
+                               }
 
-                                       $basetag = str_replace('_',' ',substr($tag,1));
-                                       $url = '#[url='.$a->get_baseurl().'/search?tag='.rawurlencode($basetag).']'.$basetag.'[/url]';
-                                       $body = str_replace($tag,$url,$body);
-                                       $tags_arr["#".$basetag] = $url;
+                               $basetag = str_replace('_', ' ', substr($tag, 1));
+                               $url = '#[url=' . $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
+                               $body = str_replace($tag, $url, $body);
+                               $tags_arr["#" . $basetag] = $url;
+                       } elseif (strpos($tag, '@') === 0) {
+                               if (strpos($tag, '[url=')) {
                                        continue;
-                               } elseif(strpos($tag,'@') === 0) {
-                                       if(strpos($tag,'[url='))
-                                               continue;
-
-                                       $basetag = substr($tag,1);
-                                       $url = '@[url=https://twitter.com/'.rawurlencode($basetag).']'.$basetag.'[/url]';
-                                       $body = str_replace($tag,$url,$body);
-                                       $tags_arr["@".$basetag] = $url;
                                }
+
+                               $basetag = substr($tag, 1);
+                               $url = '@[url=https://twitter.com/' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
+                               $body = str_replace($tag, $url, $body);
+                               $tags_arr["@" . $basetag] = $url;
                        }
                }
+       }
 
+       $tags = implode($tags_arr, ",");
 
-               $tags = implode($tags_arr, ",");
-
-       }
-       return array("body" => $body, "tags" => $tags, "plain" => $plain);
+       return ["body" => $body, "tags" => $tags, "plain" => $plain];
 }
 
 /**
@@ -1269,7 +1267,7 @@ function twitter_expand_entities($a, $body, $item, $no_tags = false, $picture) {
  * @param object $post Twitter object with the post
  * @param array $postarray Array of the item that is about to be posted
  *
- * @return $picture string Returns a a single picture string if it isn't a media post
+ * @return $picture string Image URL or empty string
  */
 function twitter_media_entities($post, &$postarray) {
 
@@ -1339,9 +1337,9 @@ function twitter_createpost($a, $uid, $post, $self, $create_user, $only_existing
 
        // Don't import our own comments
        $r = q("SELECT * FROM `item` WHERE `extid` = '%s' AND `uid` = %d LIMIT 1",
-                       dbesc($postarray['uri']),
-                       intval($uid)
-               );
+               dbesc($postarray['uri']),
+               intval($uid)
+       );
 
        if (count($r)) {
                logger("Item with extid ".$postarray['uri']." found.", LOGGER_DEBUG);
@@ -1355,9 +1353,9 @@ function twitter_createpost($a, $uid, $post, $self, $create_user, $only_existing
                $parent = "twitter::".$post->in_reply_to_status_id_str;
 
                $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
-                               dbesc($parent),
-                               intval($uid)
-                       );
+                       dbesc($parent),
+                       intval($uid)
+               );
                if (count($r)) {
                        $postarray['thr-parent'] = $r[0]["uri"];
                        $postarray['parent-uri'] = $r[0]["parent-uri"];
@@ -1365,9 +1363,9 @@ function twitter_createpost($a, $uid, $post, $self, $create_user, $only_existing
                        $postarray['object-type'] = ACTIVITY_OBJ_COMMENT;
                } else {
                        $r = q("SELECT * FROM `item` WHERE `extid` = '%s' AND `uid` = %d LIMIT 1",
-                                       dbesc($parent),
-                                       intval($uid)
-                               );
+                               dbesc($parent),
+                               intval($uid)
+                       );
                        if (count($r)) {
                                $postarray['thr-parent'] = $r[0]['uri'];
                                $postarray['parent-uri'] = $r[0]['parent-uri'];
@@ -1448,11 +1446,11 @@ function twitter_createpost($a, $uid, $post, $self, $create_user, $only_existing
        // Search for media links
        $picture = twitter_media_entities($post, $postarray);
 
-       $converted = twitter_expand_entities($a, $postarray['body'], $post, false, $picture);
+       $converted = twitter_expand_entities($a, $postarray['body'], $post, $picture);
        $postarray['body'] = $converted["body"];
        $postarray['tag'] = $converted["tags"];
-       $postarray['created'] = datetime_convert('UTC','UTC',$post->created_at);
-       $postarray['edited'] = datetime_convert('UTC','UTC',$post->created_at);
+       $postarray['created'] = DateTimeFormat::utc($post->created_at);
+       $postarray['edited'] = DateTimeFormat::utc($post->created_at);
 
        $statustext = $converted["plain"];
 
@@ -1487,8 +1485,14 @@ function twitter_createpost($a, $uid, $post, $self, $create_user, $only_existing
 
                $postarray['body'] = $statustext;
 
-               $postarray['body'] .= "\n".share_header($quoted['author-name'], $quoted['author-link'], $quoted['author-avatar'], "",
-                                                       $quoted['created'], $quoted['plink']);
+               $postarray['body'] .= "\n" . share_header(
+                       $quoted['author-name'],
+                       $quoted['author-link'],
+                       $quoted['author-avatar'],
+                       "",
+                       $quoted['created'],
+                       $quoted['plink']
+               );
 
                $postarray['body'] .= $quoted['body'].'[/share]';
        }
@@ -1501,8 +1505,8 @@ function twitter_checknotification($a, $uid, $own_id, $top_item, $postarray) {
        // this whole function doesn't seem to work. Needs complete check
 
        $user = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` LIMIT 1",
-                       intval($uid)
-               );
+               intval($uid)
+       );
 
        if(!count($user))
                return;
@@ -1512,9 +1516,9 @@ function twitter_checknotification($a, $uid, $own_id, $top_item, $postarray) {
                return;
 
        $own_user = q("SELECT * FROM `contact` WHERE `uid` = %d AND `alias` = '%s' LIMIT 1",
-                       intval($uid),
-                       dbesc("twitter::".$own_id)
-               );
+               intval($uid),
+               dbesc("twitter::".$own_id)
+       );
 
        if(!count($own_user))
                return;
@@ -1524,11 +1528,9 @@ function twitter_checknotification($a, $uid, $own_id, $top_item, $postarray) {
                return;
 
        $myconv = q("SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 AND `deleted` = 0",
-                       dbesc($postarray['parent-uri']),
-                       intval($uid)
-                       );
-
-       if(count($myconv)) {
+               dbesc($postarray['parent-uri']),
+               intval($uid)
+       );
 
                foreach($myconv as $conv) {
                        // now if we find a match, it means we're in this conversation
@@ -1543,14 +1545,14 @@ function twitter_checknotification($a, $uid, $own_id, $top_item, $postarray) {
                        notification(array(
                                'type'         => NOTIFY_COMMENT,
                                'notify_flags' => $user[0]['notify-flags'],
-                               'language'     => $user[0]['language'],
-                               'to_name'      => $user[0]['username'],
-                               'to_email'     => $user[0]['email'],
-                               'uid'          => $user[0]['uid'],
-                               'item'         => $postarray,
-                               'link'         => $a->get_baseurl().'/display/'.urlencode(get_item_guid($top_item)),
-                               'source_name'  => $postarray['author-name'],
-                               'source_link'  => $postarray['author-link'],
+                               'language' => $user[0]['language'],
+                               'to_name' => $user[0]['username'],
+                               'to_email' => $user[0]['email'],
+                               'uid' => $user[0]['uid'],
+                               'item' => $postarray,
+                               'link' => $a->get_baseurl() . '/display/' . urlencode(Item::getGuidById($top_item)),
+                               'source_name' => $postarray['author-name'],
+                               'source_link' => $postarray['author-link'],
                                'source_photo' => $postarray['author-avatar'],
                                'verb'         => ACTIVITY_POST,
                                'otype'        => 'item',
@@ -1579,9 +1581,9 @@ function twitter_fetchparentposts($a, $uid, $post, $connection, $self, $own_id)
                }
 
                $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
-                               dbesc("twitter::".$post->id_str),
-                               intval($uid)
-                       );
+                       dbesc("twitter::".$post->id_str),
+                       intval($uid)
+               );
 
                if (count($r))
                        break;
@@ -1597,10 +1599,11 @@ function twitter_fetchparentposts($a, $uid, $post, $connection, $self, $own_id)
                foreach ($posts as $post) {
                        $postarray = twitter_createpost($a, $uid, $post, $self, false, false, false);
 
-                       if (trim($postarray['body']) == "")
+                       if (trim($postarray['body']) == "") {
                                continue;
+                       }
 
-                       $item = item_store($postarray);
+                       $item = Item::insert($postarray);
                        $postarray["id"] = $item;
 
                        logger('twitter_fetchparentpost: User '.$self["nick"].' posted parent timeline item '.$item);
@@ -1626,8 +1629,7 @@ function twitter_fetchhometimeline($a, $uid) {
        if ($application_name == "")
                $application_name = $a->get_hostname();
 
-       require_once('library/twitteroauth.php');
-       require_once('include/items.php');
+       require_once 'include/items.php';
 
        $connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
 
@@ -1712,7 +1714,7 @@ function twitter_fetchhometimeline($a, $uid) {
                        if (trim($postarray['body']) == "")
                                continue;
 
-                       $item = item_store($postarray);
+                       $item = Item::insert($postarray);
                        $postarray["id"] = $item;
 
                        logger('twitter_fetchhometimeline: User '.$self["nick"].' posted home timeline item '.$item);
@@ -1759,7 +1761,7 @@ function twitter_fetchhometimeline($a, $uid) {
                        if (trim($postarray['body']) == "")
                                continue;
 
-                       $item = item_store($postarray);
+                       $item = Item::insert($postarray);
                        $postarray["id"] = $item;
 
                        if ($item && function_exists("check_item_notification"))
@@ -1779,8 +1781,9 @@ function twitter_fetchhometimeline($a, $uid) {
                                        $item = $r[0]['id'];
                                        $parent_id = $r[0]['parent'];
                                }
-                       } else
+                       } else {
                                $parent_id = $postarray['parent'];
+                       }
 
                        if (($item != 0) && !function_exists("check_item_notification")) {
                                require_once('include/enotify.php');
@@ -1792,7 +1795,7 @@ function twitter_fetchhometimeline($a, $uid) {
                                        'to_email'     => $u[0]['email'],
                                        'uid'          => $u[0]['uid'],
                                        'item'         => $postarray,
-                                       'link'         => $a->get_baseurl().'/display/'.urlencode(get_item_guid($item)),
+                                       'link'         => $a->get_baseurl() . '/display/' . urlencode(Item::getGuidById($item)),
                                        'source_name'  => $postarray['author-name'],
                                        'source_link'  => $postarray['author-link'],
                                        'source_photo' => $postarray['author-avatar'],
@@ -1818,9 +1821,7 @@ function twitter_fetch_own_contact($a, $uid) {
        $contact_id = 0;
 
        if ($own_id == "") {
-               require_once('library/twitteroauth.php');
-
-               $connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
+               $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
 
                // Fetching user data
                $user = $connection->get('account/verify_credentials');
@@ -1879,10 +1880,8 @@ function twitter_is_retweet($a, $uid, $body) {
        $otoken  = get_pconfig($uid, 'twitter', 'oauthtoken');
        $osecret = get_pconfig($uid, 'twitter', 'oauthsecret');
 
-       require_once('library/twitteroauth.php');
-       $connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
-
-       $result = $connection->post('statuses/retweet/'.$id);
+       $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
+       $result = $connection->post('statuses/retweet/' . $id);
 
        logger('twitter_is_retweet: result '.print_r($result, true), LOGGER_DEBUG);
 
index 5d6e8b2ffb28d30be9e5f19cda4b0490d587468d..7ff3dbb3781d7042af99fc5714690bf71b244e43 100644 (file)
@@ -1,10 +1,12 @@
 <?php
+
 use Friendica\Core\Config;
 
-function twitter_sync_run($argv, $argc) {
+function twitter_sync_run($argv, $argc)
+{
        global $a;
 
-       require_once("addon/twitter/twitter.php");
+       require_once 'addon/twitter/twitter.php';
 
        if (function_exists('sys_getloadavg')) {
                $load = sys_getloadavg();
@@ -27,4 +29,3 @@ function twitter_sync_run($argv, $argc) {
                twitter_fetchhometimeline($a, $uid);
        }
 }
-?>
diff --git a/twitter/vendor/abraham/twitteroauth/.gitignore b/twitter/vendor/abraham/twitteroauth/.gitignore
new file mode 100644 (file)
index 0000000..8213dad
--- /dev/null
@@ -0,0 +1,4 @@
+.DS_Store
+composer.lock
+vendor
+env
diff --git a/twitter/vendor/abraham/twitteroauth/.travis.yml b/twitter/vendor/abraham/twitteroauth/.travis.yml
new file mode 100644 (file)
index 0000000..f55a2b8
--- /dev/null
@@ -0,0 +1,13 @@
+language: php
+dist: trusty
+php:
+  - '5.6'
+  - '7.0'
+  - '7.1'
+  - hhvm
+sudo: false
+before_script:
+    - composer self-update
+    - composer install --prefer-source --no-interaction
+script:
+  - vendor/bin/phpunit
diff --git a/twitter/vendor/abraham/twitteroauth/CODE_OF_CONDUCT.md b/twitter/vendor/abraham/twitteroauth/CODE_OF_CONDUCT.md
new file mode 100644 (file)
index 0000000..dae99ff
--- /dev/null
@@ -0,0 +1,46 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at abraham@abrah.am. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
diff --git a/twitter/vendor/abraham/twitteroauth/LICENSE.md b/twitter/vendor/abraham/twitteroauth/LICENSE.md
new file mode 100644 (file)
index 0000000..64e83a1
--- /dev/null
@@ -0,0 +1,22 @@
+Copyright (c) 2009 Abraham Williams - http://abrah.am - abraham@abrah.am
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/twitter/vendor/abraham/twitteroauth/README.md b/twitter/vendor/abraham/twitteroauth/README.md
new file mode 100644 (file)
index 0000000..cc40341
--- /dev/null
@@ -0,0 +1,10 @@
+<span itemprop="name">TwitterOAuth</span> [![Build Status](https://img.shields.io/travis/abraham/twitteroauth.svg)](https://travis-ci.org/abraham/twitteroauth) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/abraham/twitteroauth/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/abraham/twitteroauth/?branch=master) [![Issues Count](https://img.shields.io/github/issues/abraham/twitteroauth.svg)](https://github.com/abraham/twitteroauth/issues) [![Latest Version](https://img.shields.io/packagist/v/abraham/twitteroauth.svg)](https://packagist.org/packages/abraham/twitteroauth)
+------------
+
+<p itemprop="description">The most popular PHP library for Twitter's OAuth REST API.</p>
+
+See documentation at https://twitteroauth.com.
+
+PHP versions [listed](https://secure.php.net/supported-versions.php) as "active support" or "security fixes only" are supported.
+
+<img src="https://raw.githubusercontent.com/abraham/twitteroauth-demo/master/images/twitter-logo-blue.png" itemprop="image" alt="Twitter bird" width="200px">
diff --git a/twitter/vendor/abraham/twitteroauth/autoload.php b/twitter/vendor/abraham/twitteroauth/autoload.php
new file mode 100644 (file)
index 0000000..cff03e8
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * Use to autoload needed classes without Composer.
+ *
+ * @param string $class The fully-qualified class name.
+ * @return void
+ */
+spl_autoload_register(function ($class) {
+
+    // project-specific namespace prefix
+    $prefix = 'Abraham\\TwitterOAuth\\';
+
+    // base directory for the namespace prefix
+    $base_dir = __DIR__ . '/src/';
+
+    // does the class use the namespace prefix?
+    $len = strlen($prefix);
+    if (strncmp($prefix, $class, $len) !== 0) {
+        // no, move to the next registered autoloader
+        return;
+    }
+
+    // get the relative class name
+    $relative_class = substr($class, $len);
+
+    // replace the namespace prefix with the base directory, replace namespace
+    // separators with directory separators in the relative class name, append
+    // with .php
+    $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
+
+    // if the file exists, require it
+    if (file_exists($file)) {
+        require $file;
+    }
+});
diff --git a/twitter/vendor/abraham/twitteroauth/composer.json b/twitter/vendor/abraham/twitteroauth/composer.json
new file mode 100644 (file)
index 0000000..4f24b27
--- /dev/null
@@ -0,0 +1,34 @@
+{
+    "name": "abraham/twitteroauth",
+    "type": "library",
+    "description": "The most popular PHP library for use with the Twitter OAuth REST API.",
+    "keywords": ["twitter", "api", "oauth", "rest", "social", "twitter api", "twitter oauth"],
+    "license": "MIT",
+    "homepage": "https://twitteroauth.com",
+    "authors": [
+        {
+            "name": "Abraham Williams",
+            "email": "abraham@abrah.am",
+            "homepage": "https://abrah.am",
+            "role": "Developer"
+        }
+    ],
+    "support": {
+        "source": "https://github.com/abraham/twitteroauth",
+        "issues": "https://github.com/abraham/twitteroauth/issues"
+    },
+    "require": {
+        "php": "^5.6 || ^7.0",
+        "ext-curl": "*"
+    },
+    "require-dev": {
+        "phpunit/phpunit": "~5.7",
+        "squizlabs/php_codesniffer": "~3.0",
+        "phpmd/phpmd": "~2.6"
+    },
+    "autoload": {
+        "psr-4": {
+            "Abraham\\TwitterOAuth\\": "src"
+        }
+    }
+}
diff --git a/twitter/vendor/abraham/twitteroauth/phpmd.xml b/twitter/vendor/abraham/twitteroauth/phpmd.xml
new file mode 100644 (file)
index 0000000..ef45e75
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<ruleset name="My first PHPMD rule set"
+         xmlns="http://pmd.sf.net/ruleset/1.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
+         xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
+  <description>Keep TwitterOAuth source code clean.</description>
+
+  <!-- <rule ref="rulesets/cleancode.xml" /> -->
+  <rule ref="rulesets/codesize.xml" />
+  <rule ref="rulesets/controversial.xml" />
+  <rule ref="rulesets/design.xml" />
+  <rule ref="rulesets/naming.xml" />
+  <rule ref="rulesets/unusedcode.xml" />
+</ruleset>
diff --git a/twitter/vendor/abraham/twitteroauth/phpunit.xml b/twitter/vendor/abraham/twitteroauth/phpunit.xml
new file mode 100644 (file)
index 0000000..71cc3e1
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit
+        colors="true"
+        bootstrap="tests/bootstrap.php">
+
+    <testsuites>
+        <testsuite name="TwitterOAuth Test Suite">
+            <directory>./tests/</directory>
+        </testsuite>
+    </testsuites>
+</phpunit>
diff --git a/twitter/vendor/abraham/twitteroauth/src/Config.php b/twitter/vendor/abraham/twitteroauth/src/Config.php
new file mode 100644 (file)
index 0000000..122016c
--- /dev/null
@@ -0,0 +1,90 @@
+<?php
+
+namespace Abraham\TwitterOAuth;
+
+/**
+ * Handle setting and storing config for TwitterOAuth.
+ *
+ * @author Abraham Williams <abraham@abrah.am>
+ */
+class Config
+{
+    /** @var int How long to wait for a response from the API */
+    protected $timeout = 5;
+    /** @var int how long to wait while connecting to the API */
+    protected $connectionTimeout = 5;
+    /**
+     * Decode JSON Response as associative Array
+     *
+     * @see http://php.net/manual/en/function.json-decode.php
+     *
+     * @var bool
+     */
+    protected $decodeJsonAsArray = false;
+    /** @var string User-Agent header */
+    protected $userAgent = 'TwitterOAuth (+https://twitteroauth.com)';
+    /** @var array Store proxy connection details */
+    protected $proxy = [];
+
+    /** @var bool Whether to encode the curl requests with gzip or not */
+    protected $gzipEncoding = true;
+
+    /** @var integer Size for Chunked Uploads */
+    protected $chunkSize = 250000; // 0.25 MegaByte
+
+    /**
+     * Set the connection and response timeouts.
+     *
+     * @param int $connectionTimeout
+     * @param int $timeout
+     */
+    public function setTimeouts($connectionTimeout, $timeout)
+    {
+        $this->connectionTimeout = (int)$connectionTimeout;
+        $this->timeout = (int)$timeout;
+    }
+
+    /**
+     * @param bool $value
+     */
+    public function setDecodeJsonAsArray($value)
+    {
+        $this->decodeJsonAsArray = (bool)$value;
+    }
+
+    /**
+     * @param string $userAgent
+     */
+    public function setUserAgent($userAgent)
+    {
+        $this->userAgent = (string)$userAgent;
+    }
+
+    /**
+     * @param array $proxy
+     */
+    public function setProxy(array $proxy)
+    {
+        $this->proxy = $proxy;
+    }
+
+    /**
+     * Whether to encode the curl requests with gzip or not.
+     *
+     * @param boolean $gzipEncoding
+     */
+    public function setGzipEncoding($gzipEncoding)
+    {
+        $this->gzipEncoding = (bool)$gzipEncoding;
+    }
+
+    /**
+     * Set the size of each part of file for chunked media upload.
+     *
+     * @param int $value
+     */
+    public function setChunkSize($value)
+    {
+        $this->chunkSize = (int)$value;
+    }
+}
diff --git a/twitter/vendor/abraham/twitteroauth/src/Consumer.php b/twitter/vendor/abraham/twitteroauth/src/Consumer.php
new file mode 100644 (file)
index 0000000..ceaf1ef
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+class Consumer
+{
+    /** @var string  */
+    public $key;
+    /** @var string  */
+    public $secret;
+    /** @var string|null  */
+    public $callbackUrl;
+
+    /**
+     * @param string $key
+     * @param string $secret
+     * @param null $callbackUrl
+     */
+    public function __construct($key, $secret, $callbackUrl = null)
+    {
+        $this->key = $key;
+        $this->secret = $secret;
+        $this->callbackUrl = $callbackUrl;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return "Consumer[key=$this->key,secret=$this->secret]";
+    }
+}
diff --git a/twitter/vendor/abraham/twitteroauth/src/HmacSha1.php b/twitter/vendor/abraham/twitteroauth/src/HmacSha1.php
new file mode 100644 (file)
index 0000000..d8cdab8
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+/**
+ * The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as defined in [RFC2104]
+ * where the Signature Base String is the text and the key is the concatenated values (each first
+ * encoded per Parameter Encoding) of the Consumer Secret and Token Secret, separated by an '&'
+ * character (ASCII code 38) even if empty.
+ *   - Chapter 9.2 ("HMAC-SHA1")
+ */
+class HmacSha1 extends SignatureMethod
+{
+    /**
+     * {@inheritDoc}
+     */
+    public function getName()
+    {
+        return "HMAC-SHA1";
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function buildSignature(Request $request, Consumer $consumer, Token $token = null)
+    {
+        $signatureBase = $request->getSignatureBaseString();
+
+        $parts = [$consumer->secret, null !== $token ? $token->secret : ""];
+
+        $parts = Util::urlencodeRfc3986($parts);
+        $key = implode('&', $parts);
+
+        return base64_encode(hash_hmac('sha1', $signatureBase, $key, true));
+    }
+}
diff --git a/twitter/vendor/abraham/twitteroauth/src/Request.php b/twitter/vendor/abraham/twitteroauth/src/Request.php
new file mode 100644 (file)
index 0000000..a60c23d
--- /dev/null
@@ -0,0 +1,254 @@
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+class Request
+{
+    protected $parameters;
+    protected $httpMethod;
+    protected $httpUrl;
+    public static $version = '1.0';
+
+    /**
+     * Constructor
+     *
+     * @param string     $httpMethod
+     * @param string     $httpUrl
+     * @param array|null $parameters
+     */
+    public function __construct($httpMethod, $httpUrl, array $parameters = [])
+    {
+        $parameters = array_merge(Util::parseParameters(parse_url($httpUrl, PHP_URL_QUERY)), $parameters);
+        $this->parameters = $parameters;
+        $this->httpMethod = $httpMethod;
+        $this->httpUrl = $httpUrl;
+    }
+
+    /**
+     * pretty much a helper function to set up the request
+     *
+     * @param Consumer $consumer
+     * @param Token    $token
+     * @param string   $httpMethod
+     * @param string   $httpUrl
+     * @param array    $parameters
+     *
+     * @return Request
+     */
+    public static function fromConsumerAndToken(
+        Consumer $consumer,
+        Token $token = null,
+        $httpMethod,
+        $httpUrl,
+        array $parameters = []
+    ) {
+        $defaults = [
+            "oauth_version" => Request::$version,
+            "oauth_nonce" => Request::generateNonce(),
+            "oauth_timestamp" => time(),
+            "oauth_consumer_key" => $consumer->key
+        ];
+        if (null !== $token) {
+            $defaults['oauth_token'] = $token->key;
+        }
+
+        $parameters = array_merge($defaults, $parameters);
+
+        return new Request($httpMethod, $httpUrl, $parameters);
+    }
+
+    /**
+     * @param string $name
+     * @param string $value
+     */
+    public function setParameter($name, $value)
+    {
+        $this->parameters[$name] = $value;
+    }
+
+    /**
+     * @param $name
+     *
+     * @return string|null
+     */
+    public function getParameter($name)
+    {
+        return isset($this->parameters[$name]) ? $this->parameters[$name] : null;
+    }
+
+    /**
+     * @return array
+     */
+    public function getParameters()
+    {
+        return $this->parameters;
+    }
+
+    /**
+     * @param $name
+     */
+    public function removeParameter($name)
+    {
+        unset($this->parameters[$name]);
+    }
+
+    /**
+     * The request parameters, sorted and concatenated into a normalized string.
+     *
+     * @return string
+     */
+    public function getSignableParameters()
+    {
+        // Grab all parameters
+        $params = $this->parameters;
+
+        // Remove oauth_signature if present
+        // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.")
+        if (isset($params['oauth_signature'])) {
+            unset($params['oauth_signature']);
+        }
+
+        return Util::buildHttpQuery($params);
+    }
+
+    /**
+     * Returns the base string of this request
+     *
+     * The base string defined as the method, the url
+     * and the parameters (normalized), each urlencoded
+     * and the concated with &.
+     *
+     * @return string
+     */
+    public function getSignatureBaseString()
+    {
+        $parts = [
+            $this->getNormalizedHttpMethod(),
+            $this->getNormalizedHttpUrl(),
+            $this->getSignableParameters()
+        ];
+
+        $parts = Util::urlencodeRfc3986($parts);
+
+        return implode('&', $parts);
+    }
+
+    /**
+     * Returns the HTTP Method in uppercase
+     *
+     * @return string
+     */
+    public function getNormalizedHttpMethod()
+    {
+        return strtoupper($this->httpMethod);
+    }
+
+    /**
+     * parses the url and rebuilds it to be
+     * scheme://host/path
+     *
+     * @return string
+     */
+    public function getNormalizedHttpUrl()
+    {
+        $parts = parse_url($this->httpUrl);
+
+        $scheme = $parts['scheme'];
+        $host = strtolower($parts['host']);
+        $path = $parts['path'];
+
+        return "$scheme://$host$path";
+    }
+
+    /**
+     * Builds a url usable for a GET request
+     *
+     * @return string
+     */
+    public function toUrl()
+    {
+        $postData = $this->toPostdata();
+        $out = $this->getNormalizedHttpUrl();
+        if ($postData) {
+            $out .= '?' . $postData;
+        }
+        return $out;
+    }
+
+    /**
+     * Builds the data one would send in a POST request
+     *
+     * @return string
+     */
+    public function toPostdata()
+    {
+        return Util::buildHttpQuery($this->parameters);
+    }
+
+    /**
+     * Builds the Authorization: header
+     *
+     * @return string
+     * @throws TwitterOAuthException
+     */
+    public function toHeader()
+    {
+        $first = true;
+        $out = 'Authorization: OAuth';
+        foreach ($this->parameters as $k => $v) {
+            if (substr($k, 0, 5) != "oauth") {
+                continue;
+            }
+            if (is_array($v)) {
+                throw new TwitterOAuthException('Arrays not supported in headers');
+            }
+            $out .= ($first) ? ' ' : ', ';
+            $out .= Util::urlencodeRfc3986($k) . '="' . Util::urlencodeRfc3986($v) . '"';
+            $first = false;
+        }
+        return $out;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->toUrl();
+    }
+
+    /**
+     * @param SignatureMethod $signatureMethod
+     * @param Consumer        $consumer
+     * @param Token           $token
+     */
+    public function signRequest(SignatureMethod $signatureMethod, Consumer $consumer, Token $token = null)
+    {
+        $this->setParameter("oauth_signature_method", $signatureMethod->getName());
+        $signature = $this->buildSignature($signatureMethod, $consumer, $token);
+        $this->setParameter("oauth_signature", $signature);
+    }
+
+    /**
+     * @param SignatureMethod $signatureMethod
+     * @param Consumer        $consumer
+     * @param Token           $token
+     *
+     * @return string
+     */
+    public function buildSignature(SignatureMethod $signatureMethod, Consumer $consumer, Token $token = null)
+    {
+        return $signatureMethod->buildSignature($this, $consumer, $token);
+    }
+
+    /**
+     * @return string
+     */
+    public static function generateNonce()
+    {
+        return md5(microtime() . mt_rand());
+    }
+}
diff --git a/twitter/vendor/abraham/twitteroauth/src/Response.php b/twitter/vendor/abraham/twitteroauth/src/Response.php
new file mode 100644 (file)
index 0000000..982b6ae
--- /dev/null
@@ -0,0 +1,107 @@
+<?php
+
+namespace Abraham\TwitterOAuth;
+
+/**
+ * The result of the most recent API request.
+ *
+ * @author Abraham Williams <abraham@abrah.am>
+ */
+class Response
+{
+    /** @var string|null API path from the most recent request */
+    private $apiPath;
+    /** @var int HTTP status code from the most recent request */
+    private $httpCode = 0;
+    /** @var array HTTP headers from the most recent request */
+    private $headers = [];
+    /** @var array|object Response body from the most recent request */
+    private $body = [];
+    /** @var array HTTP headers from the most recent request that start with X */
+    private $xHeaders = [];
+
+    /**
+     * @param string $apiPath
+     */
+    public function setApiPath($apiPath)
+    {
+        $this->apiPath = $apiPath;
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getApiPath()
+    {
+        return $this->apiPath;
+    }
+
+    /**
+     * @param array|object $body
+     */
+    public function setBody($body)
+    {
+        $this->body = $body;
+    }
+
+    /**
+     * @return array|object|string
+     */
+    public function getBody()
+    {
+        return $this->body;
+    }
+
+    /**
+     * @param int $httpCode
+     */
+    public function setHttpCode($httpCode)
+    {
+        $this->httpCode = $httpCode;
+    }
+
+    /**
+     * @return int
+     */
+    public function getHttpCode()
+    {
+        return $this->httpCode;
+    }
+
+    /**
+     * @param array $headers
+     */
+    public function setHeaders(array $headers)
+    {
+        foreach ($headers as $key => $value) {
+            if (substr($key, 0, 1) == 'x') {
+                $this->xHeaders[$key] = $value;
+            }
+        }
+        $this->headers = $headers;
+    }
+
+    /**
+     * @return array
+     */
+    public function getsHeaders()
+    {
+        return $this->headers;
+    }
+
+    /**
+     * @param array $xHeaders
+     */
+    public function setXHeaders(array $xHeaders = [])
+    {
+        $this->xHeaders = $xHeaders;
+    }
+
+    /**
+     * @return array
+     */
+    public function getXHeaders()
+    {
+        return $this->xHeaders;
+    }
+}
diff --git a/twitter/vendor/abraham/twitteroauth/src/SignatureMethod.php b/twitter/vendor/abraham/twitteroauth/src/SignatureMethod.php
new file mode 100644 (file)
index 0000000..40fd51e
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+/**
+ * A class for implementing a Signature Method
+ * See section 9 ("Signing Requests") in the spec
+ */
+abstract class SignatureMethod
+{
+    /**
+     * Needs to return the name of the Signature Method (ie HMAC-SHA1)
+     *
+     * @return string
+     */
+    abstract public function getName();
+
+    /**
+     * Build up the signature
+     * NOTE: The output of this function MUST NOT be urlencoded.
+     * the encoding is handled in OAuthRequest when the final
+     * request is serialized
+     *
+     * @param Request $request
+     * @param Consumer $consumer
+     * @param Token $token
+     *
+     * @return string
+     */
+    abstract public function buildSignature(Request $request, Consumer $consumer, Token $token = null);
+
+    /**
+     * Verifies that a given signature is correct
+     *
+     * @param Request $request
+     * @param Consumer $consumer
+     * @param Token $token
+     * @param string $signature
+     *
+     * @return bool
+     */
+    public function checkSignature(Request $request, Consumer $consumer, Token $token, $signature)
+    {
+        $built = $this->buildSignature($request, $consumer, $token);
+
+        // Check for zero length, although unlikely here
+        if (strlen($built) == 0 || strlen($signature) == 0) {
+            return false;
+        }
+
+        if (strlen($built) != strlen($signature)) {
+            return false;
+        }
+
+        // Avoid a timing leak with a (hopefully) time insensitive compare
+        $result = 0;
+        for ($i = 0; $i < strlen($signature); $i++) {
+            $result |= ord($built{$i}) ^ ord($signature{$i});
+        }
+
+        return $result == 0;
+    }
+}
diff --git a/twitter/vendor/abraham/twitteroauth/src/Token.php b/twitter/vendor/abraham/twitteroauth/src/Token.php
new file mode 100644 (file)
index 0000000..140c1ec
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+class Token
+{
+    /** @var string */
+    public $key;
+    /** @var string */
+    public $secret;
+
+    /**
+     * @param string $key    The OAuth Token
+     * @param string $secret The OAuth Token Secret
+     */
+    public function __construct($key, $secret)
+    {
+        $this->key = $key;
+        $this->secret = $secret;
+    }
+
+    /**
+     * Generates the basic string serialization of a token that a server
+     * would respond to request_token and access_token calls with
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return sprintf("oauth_token=%s&oauth_token_secret=%s",
+            Util::urlencodeRfc3986($this->key),
+            Util::urlencodeRfc3986($this->secret)
+        );
+    }
+}
diff --git a/twitter/vendor/abraham/twitteroauth/src/TwitterOAuth.php b/twitter/vendor/abraham/twitteroauth/src/TwitterOAuth.php
new file mode 100644 (file)
index 0000000..fbb2e41
--- /dev/null
@@ -0,0 +1,508 @@
+<?php
+/**
+ * The most popular PHP library for use with the Twitter OAuth REST API.
+ *
+ * @license MIT
+ */
+namespace Abraham\TwitterOAuth;
+
+use Abraham\TwitterOAuth\Util\JsonDecoder;
+
+/**
+ * TwitterOAuth class for interacting with the Twitter API.
+ *
+ * @author Abraham Williams <abraham@abrah.am>
+ */
+class TwitterOAuth extends Config
+{
+    const API_VERSION = '1.1';
+    const API_HOST = 'https://api.twitter.com';
+    const UPLOAD_HOST = 'https://upload.twitter.com';
+
+    /** @var Response details about the result of the last request */
+    private $response;
+    /** @var string|null Application bearer token */
+    private $bearer;
+    /** @var Consumer Twitter application details */
+    private $consumer;
+    /** @var Token|null User access token details */
+    private $token;
+    /** @var HmacSha1 OAuth 1 signature type used by Twitter */
+    private $signatureMethod;
+
+    /**
+     * Constructor
+     *
+     * @param string      $consumerKey      The Application Consumer Key
+     * @param string      $consumerSecret   The Application Consumer Secret
+     * @param string|null $oauthToken       The Client Token (optional)
+     * @param string|null $oauthTokenSecret The Client Token Secret (optional)
+     */
+    public function __construct($consumerKey, $consumerSecret, $oauthToken = null, $oauthTokenSecret = null)
+    {
+        $this->resetLastResponse();
+        $this->signatureMethod = new HmacSha1();
+        $this->consumer = new Consumer($consumerKey, $consumerSecret);
+        if (!empty($oauthToken) && !empty($oauthTokenSecret)) {
+            $this->token = new Token($oauthToken, $oauthTokenSecret);
+        }
+        if (empty($oauthToken) && !empty($oauthTokenSecret)) {
+            $this->bearer = $oauthTokenSecret;
+        }
+    }
+
+    /**
+     * @param string $oauthToken
+     * @param string $oauthTokenSecret
+     */
+    public function setOauthToken($oauthToken, $oauthTokenSecret)
+    {
+        $this->token = new Token($oauthToken, $oauthTokenSecret);
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getLastApiPath()
+    {
+        return $this->response->getApiPath();
+    }
+
+    /**
+     * @return int
+     */
+    public function getLastHttpCode()
+    {
+        return $this->response->getHttpCode();
+    }
+
+    /**
+     * @return array
+     */
+    public function getLastXHeaders()
+    {
+        return $this->response->getXHeaders();
+    }
+
+    /**
+     * @return array|object|null
+     */
+    public function getLastBody()
+    {
+        return $this->response->getBody();
+    }
+
+    /**
+     * Resets the last response cache.
+     */
+    public function resetLastResponse()
+    {
+        $this->response = new Response();
+    }
+
+    /**
+     * Make URLs for user browser navigation.
+     *
+     * @param string $path
+     * @param array  $parameters
+     *
+     * @return string
+     */
+    public function url($path, array $parameters)
+    {
+        $this->resetLastResponse();
+        $this->response->setApiPath($path);
+        $query = http_build_query($parameters);
+        return sprintf('%s/%s?%s', self::API_HOST, $path, $query);
+    }
+
+    /**
+     * Make /oauth/* requests to the API.
+     *
+     * @param string $path
+     * @param array  $parameters
+     *
+     * @return array
+     * @throws TwitterOAuthException
+     */
+    public function oauth($path, array $parameters = [])
+    {
+        $response = [];
+        $this->resetLastResponse();
+        $this->response->setApiPath($path);
+        $url = sprintf('%s/%s', self::API_HOST, $path);
+        $result = $this->oAuthRequest($url, 'POST', $parameters);
+
+        if ($this->getLastHttpCode() != 200) {
+            throw new TwitterOAuthException($result);
+        }
+
+        parse_str($result, $response);
+        $this->response->setBody($response);
+
+        return $response;
+    }
+
+    /**
+     * Make /oauth2/* requests to the API.
+     *
+     * @param string $path
+     * @param array  $parameters
+     *
+     * @return array|object
+     */
+    public function oauth2($path, array $parameters = [])
+    {
+        $method = 'POST';
+        $this->resetLastResponse();
+        $this->response->setApiPath($path);
+        $url = sprintf('%s/%s', self::API_HOST, $path);
+        $request = Request::fromConsumerAndToken($this->consumer, $this->token, $method, $url, $parameters);
+        $authorization = 'Authorization: Basic ' . $this->encodeAppAuthorization($this->consumer);
+        $result = $this->request($request->getNormalizedHttpUrl(), $method, $authorization, $parameters);
+        $response = JsonDecoder::decode($result, $this->decodeJsonAsArray);
+        $this->response->setBody($response);
+        return $response;
+    }
+
+    /**
+     * Make GET requests to the API.
+     *
+     * @param string $path
+     * @param array  $parameters
+     *
+     * @return array|object
+     */
+    public function get($path, array $parameters = [])
+    {
+        return $this->http('GET', self::API_HOST, $path, $parameters);
+    }
+
+    /**
+     * Make POST requests to the API.
+     *
+     * @param string $path
+     * @param array  $parameters
+     *
+     * @return array|object
+     */
+    public function post($path, array $parameters = [])
+    {
+        return $this->http('POST', self::API_HOST, $path, $parameters);
+    }
+
+    /**
+     * Make DELETE requests to the API.
+     *
+     * @param string $path
+     * @param array  $parameters
+     *
+     * @return array|object
+     */
+    public function delete($path, array $parameters = [])
+    {
+        return $this->http('DELETE', self::API_HOST, $path, $parameters);
+    }
+
+    /**
+     * Make PUT requests to the API.
+     *
+     * @param string $path
+     * @param array  $parameters
+     *
+     * @return array|object
+     */
+    public function put($path, array $parameters = [])
+    {
+        return $this->http('PUT', self::API_HOST, $path, $parameters);
+    }
+
+    /**
+     * Upload media to upload.twitter.com.
+     *
+     * @param string $path
+     * @param array  $parameters
+     * @param boolean  $chunked
+     *
+     * @return array|object
+     */
+    public function upload($path, array $parameters = [], $chunked = false)
+    {
+        if ($chunked) {
+            return $this->uploadMediaChunked($path, $parameters);
+        } else {
+            return $this->uploadMediaNotChunked($path, $parameters);
+        }
+    }
+
+    /**
+     * Private method to upload media (not chunked) to upload.twitter.com.
+     *
+     * @param string $path
+     * @param array  $parameters
+     *
+     * @return array|object
+     */
+    private function uploadMediaNotChunked($path, array $parameters)
+    {
+        $file = file_get_contents($parameters['media']);
+        $base = base64_encode($file);
+        $parameters['media'] = $base;
+        return $this->http('POST', self::UPLOAD_HOST, $path, $parameters);
+    }
+
+    /**
+     * Private method to upload media (chunked) to upload.twitter.com.
+     *
+     * @param string $path
+     * @param array  $parameters
+     *
+     * @return array|object
+     */
+    private function uploadMediaChunked($path, array $parameters)
+    {
+        $init = $this->http('POST', self::UPLOAD_HOST, $path, $this->mediaInitParameters($parameters));
+        // Append
+        $segmentIndex = 0;
+        $media = fopen($parameters['media'], 'rb');
+        while (!feof($media))
+        {
+            $this->http('POST', self::UPLOAD_HOST, 'media/upload', [
+                'command' => 'APPEND',
+                'media_id' => $init->media_id_string,
+                'segment_index' => $segmentIndex++,
+                'media_data' => base64_encode(fread($media, $this->chunkSize))
+            ]);
+        }
+        fclose($media);
+        // Finalize
+        $finalize = $this->http('POST', self::UPLOAD_HOST, 'media/upload', [
+            'command' => 'FINALIZE',
+            'media_id' => $init->media_id_string
+        ]);
+        return $finalize;
+    }
+
+    /**
+     * Private method to get params for upload media chunked init.
+     * Twitter docs: https://dev.twitter.com/rest/reference/post/media/upload-init.html
+     *
+     * @param array  $parameters
+     *
+     * @return array
+     */
+    private function mediaInitParameters(array $parameters)
+    {
+        $return = [
+            'command' => 'INIT',
+            'media_type' => $parameters['media_type'],
+            'total_bytes' => filesize($parameters['media'])
+        ];
+        if (isset($parameters['additional_owners'])) {
+            $return['additional_owners'] = $parameters['additional_owners'];
+        }
+        if (isset($parameters['media_category'])) {
+            $return['media_category'] = $parameters['media_category'];
+        }
+        return $return;
+    }
+
+    /**
+     * @param string $method
+     * @param string $host
+     * @param string $path
+     * @param array  $parameters
+     *
+     * @return array|object
+     */
+    private function http($method, $host, $path, array $parameters)
+    {
+        $this->resetLastResponse();
+        $url = sprintf('%s/%s/%s.json', $host, self::API_VERSION, $path);
+        $this->response->setApiPath($path);
+        $result = $this->oAuthRequest($url, $method, $parameters);
+        $response = JsonDecoder::decode($result, $this->decodeJsonAsArray);
+        $this->response->setBody($response);
+        return $response;
+    }
+
+    /**
+     * Format and sign an OAuth / API request
+     *
+     * @param string $url
+     * @param string $method
+     * @param array  $parameters
+     *
+     * @return string
+     * @throws TwitterOAuthException
+     */
+    private function oAuthRequest($url, $method, array $parameters)
+    {
+        $request = Request::fromConsumerAndToken($this->consumer, $this->token, $method, $url, $parameters);
+        if (array_key_exists('oauth_callback', $parameters)) {
+            // Twitter doesn't like oauth_callback as a parameter.
+            unset($parameters['oauth_callback']);
+        }
+        if ($this->bearer === null) {
+            $request->signRequest($this->signatureMethod, $this->consumer, $this->token);
+            $authorization = $request->toHeader();
+            if (array_key_exists('oauth_verifier', $parameters)) {
+                // Twitter doesn't always work with oauth in the body and in the header
+                // and it's already included in the $authorization header
+                unset($parameters['oauth_verifier']);
+            }
+        } else {
+            $authorization = 'Authorization: Bearer ' . $this->bearer;
+        }
+        return $this->request($request->getNormalizedHttpUrl(), $method, $authorization, $parameters);
+    }
+
+    /**
+     * Set Curl options.
+     *
+     * @return array
+     */
+    private function curlOptions()
+    {
+        $options = [
+            // CURLOPT_VERBOSE => true,
+            CURLOPT_CONNECTTIMEOUT => $this->connectionTimeout,
+            CURLOPT_HEADER => true,
+            CURLOPT_RETURNTRANSFER => true,
+            CURLOPT_SSL_VERIFYHOST => 2,
+            CURLOPT_SSL_VERIFYPEER => true,
+            CURLOPT_TIMEOUT => $this->timeout,
+            CURLOPT_USERAGENT => $this->userAgent,
+        ];
+
+        if ($this->useCAFile()) {
+            $options[CURLOPT_CAINFO] = __DIR__ . DIRECTORY_SEPARATOR . 'cacert.pem';
+        }
+
+        if($this->gzipEncoding) {
+            $options[CURLOPT_ENCODING] = 'gzip';
+        }
+
+        if (!empty($this->proxy)) {
+            $options[CURLOPT_PROXY] = $this->proxy['CURLOPT_PROXY'];
+            $options[CURLOPT_PROXYUSERPWD] = $this->proxy['CURLOPT_PROXYUSERPWD'];
+            $options[CURLOPT_PROXYPORT] = $this->proxy['CURLOPT_PROXYPORT'];
+            $options[CURLOPT_PROXYAUTH] = CURLAUTH_BASIC;
+            $options[CURLOPT_PROXYTYPE] = CURLPROXY_HTTP;
+        }
+
+        return $options;
+    }
+
+    /**
+     * Make an HTTP request
+     *
+     * @param string $url
+     * @param string $method
+     * @param string $authorization
+     * @param array $postfields
+     *
+     * @return string
+     * @throws TwitterOAuthException
+     */
+    private function request($url, $method, $authorization, array $postfields)
+    {
+        $options = $this->curlOptions($url, $authorization);
+        $options[CURLOPT_URL] = $url;
+        $options[CURLOPT_HTTPHEADER] = ['Accept: application/json', $authorization, 'Expect:'];
+
+        switch ($method) {
+            case 'GET':
+                break;
+            case 'POST':
+                $options[CURLOPT_POST] = true;
+                $options[CURLOPT_POSTFIELDS] = Util::buildHttpQuery($postfields);
+                break;
+            case 'DELETE':
+                $options[CURLOPT_CUSTOMREQUEST] = 'DELETE';
+                break;
+            case 'PUT':
+                $options[CURLOPT_CUSTOMREQUEST] = 'PUT';
+                break;
+        }
+
+        if (in_array($method, ['GET', 'PUT', 'DELETE']) && !empty($postfields)) {
+            $options[CURLOPT_URL] .= '?' . Util::buildHttpQuery($postfields);
+        }
+
+
+        $curlHandle = curl_init();
+        curl_setopt_array($curlHandle, $options);
+        $response = curl_exec($curlHandle);
+
+        // Throw exceptions on cURL errors.
+        if (curl_errno($curlHandle) > 0) {
+            throw new TwitterOAuthException(curl_error($curlHandle), curl_errno($curlHandle));
+        }
+
+        $this->response->setHttpCode(curl_getinfo($curlHandle, CURLINFO_HTTP_CODE));
+        $parts = explode("\r\n\r\n", $response);
+        $responseBody = array_pop($parts);
+        $responseHeader = array_pop($parts);
+        $this->response->setHeaders($this->parseHeaders($responseHeader));
+
+        curl_close($curlHandle);
+
+        return $responseBody;
+    }
+
+    /**
+     * Get the header info to store.
+     *
+     * @param string $header
+     *
+     * @return array
+     */
+    private function parseHeaders($header)
+    {
+        $headers = [];
+        foreach (explode("\r\n", $header) as $line) {
+            if (strpos($line, ':') !== false) {
+                list ($key, $value) = explode(': ', $line);
+                $key = str_replace('-', '_', strtolower($key));
+                $headers[$key] = trim($value);
+            }
+        }
+        return $headers;
+    }
+
+    /**
+     * Encode application authorization header with base64.
+     *
+     * @param Consumer $consumer
+     *
+     * @return string
+     */
+    private function encodeAppAuthorization(Consumer $consumer)
+    {
+        $key = rawurlencode($consumer->key);
+        $secret = rawurlencode($consumer->secret);
+        return base64_encode($key . ':' . $secret);
+    }
+
+    /**
+     * Is the code running from a Phar module.
+     *
+     * @return boolean
+     */
+    private function pharRunning()
+    {
+        return class_exists('Phar') && \Phar::running(false) !== '';
+    }
+
+    /**
+     * Use included CA file instead of OS provided list.
+     *
+     * @return boolean
+     */
+    private function useCAFile()
+    {
+        /* Use CACert file when not in a PHAR file. */
+        return !$this->pharRunning();
+    }
+}
diff --git a/twitter/vendor/abraham/twitteroauth/src/TwitterOAuthException.php b/twitter/vendor/abraham/twitteroauth/src/TwitterOAuthException.php
new file mode 100644 (file)
index 0000000..79903ec
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+
+namespace Abraham\TwitterOAuth;
+
+/**
+ * @author Abraham Williams <abraham@abrah.am>
+ */
+class TwitterOAuthException extends \Exception
+{
+}
diff --git a/twitter/vendor/abraham/twitteroauth/src/Util.php b/twitter/vendor/abraham/twitteroauth/src/Util.php
new file mode 100644 (file)
index 0000000..372af95
--- /dev/null
@@ -0,0 +1,115 @@
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+class Util
+{
+    /**
+     * @param $input
+     *
+     * @return array|mixed|string
+     */
+    public static function urlencodeRfc3986($input)
+    {
+        $output = '';
+        if (is_array($input)) {
+            $output = array_map([__NAMESPACE__ . '\Util', 'urlencodeRfc3986'], $input);
+        } elseif (is_scalar($input)) {
+            $output = rawurlencode($input);
+        }
+        return $output;
+    }
+
+    /**
+     * @param string $string
+     *
+     * @return string
+     */
+    public static function urldecodeRfc3986($string)
+    {
+        return urldecode($string);
+    }
+
+    /**
+     * This function takes a input like a=b&a=c&d=e and returns the parsed
+     * parameters like this
+     * array('a' => array('b','c'), 'd' => 'e')
+     *
+     * @param string $input
+     *
+     * @return array
+     */
+    public static function parseParameters($input)
+    {
+        if (!is_string($input)) {
+            return [];
+        }
+
+        $pairs = explode('&', $input);
+
+        $parameters = [];
+        foreach ($pairs as $pair) {
+            $split = explode('=', $pair, 2);
+            $parameter = Util::urldecodeRfc3986($split[0]);
+            $value = isset($split[1]) ? Util::urldecodeRfc3986($split[1]) : '';
+
+            if (isset($parameters[$parameter])) {
+                // We have already recieved parameter(s) with this name, so add to the list
+                // of parameters with this name
+
+                if (is_scalar($parameters[$parameter])) {
+                    // This is the first duplicate, so transform scalar (string) into an array
+                    // so we can add the duplicates
+                    $parameters[$parameter] = [$parameters[$parameter]];
+                }
+
+                $parameters[$parameter][] = $value;
+            } else {
+                $parameters[$parameter] = $value;
+            }
+        }
+        return $parameters;
+    }
+
+    /**
+     * @param array $params
+     *
+     * @return string
+     */
+    public static function buildHttpQuery(array $params)
+    {
+        if (empty($params)) {
+            return '';
+        }
+
+        // Urlencode both keys and values
+        $keys = Util::urlencodeRfc3986(array_keys($params));
+        $values = Util::urlencodeRfc3986(array_values($params));
+        $params = array_combine($keys, $values);
+
+        // Parameters are sorted by name, using lexicographical byte value ordering.
+        // Ref: Spec: 9.1.1 (1)
+        uksort($params, 'strcmp');
+
+        $pairs = [];
+        foreach ($params as $parameter => $value) {
+            if (is_array($value)) {
+                // If two or more parameters share the same name, they are sorted by their value
+                // Ref: Spec: 9.1.1 (1)
+                // June 12th, 2010 - changed to sort because of issue 164 by hidetaka
+                sort($value, SORT_STRING);
+                foreach ($value as $duplicateValue) {
+                    $pairs[] = $parameter . '=' . $duplicateValue;
+                }
+            } else {
+                $pairs[] = $parameter . '=' . $value;
+            }
+        }
+        // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61)
+        // Each name-value pair is separated by an '&' character (ASCII code 38)
+        return implode('&', $pairs);
+    }
+}
diff --git a/twitter/vendor/abraham/twitteroauth/src/Util/JsonDecoder.php b/twitter/vendor/abraham/twitteroauth/src/Util/JsonDecoder.php
new file mode 100644 (file)
index 0000000..c8589c5
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+
+namespace Abraham\TwitterOAuth\Util;
+
+/**
+ * @author louis <louis@systemli.org>
+ */
+class JsonDecoder
+{
+    /**
+     * Decodes a JSON string to stdObject or associative array
+     *
+     * @param string $string
+     * @param bool   $asArray
+     *
+     * @return array|object
+     */
+    public static function decode($string, $asArray)
+    {
+        if (version_compare(PHP_VERSION, '5.4.0', '>=') && !(defined('JSON_C_VERSION') && PHP_INT_SIZE > 4)) {
+            return json_decode($string, $asArray, 512, JSON_BIGINT_AS_STRING);
+        }
+
+        return json_decode($string, $asArray);
+    }
+}
diff --git a/twitter/vendor/abraham/twitteroauth/src/cacert.pem b/twitter/vendor/abraham/twitteroauth/src/cacert.pem
new file mode 100644 (file)
index 0000000..8849e02
--- /dev/null
@@ -0,0 +1,4043 @@
+##
+## Bundle of CA Root Certificates
+##
+## Certificate data from Mozilla as of: Wed Jan 18 04:12:05 2017 GMT
+##
+## This is a bundle of X.509 certificates of public Certificate Authorities
+## (CA). These were automatically extracted from Mozilla's root certificates
+## file (certdata.txt).  This file can be found in the mozilla source tree:
+## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
+##
+## It contains the certificates in PEM format and therefore
+## can be directly used with curl / libcurl / php_curl, or with
+## an Apache+mod_ssl webserver for SSL client authentication.
+## Just configure this file as the SSLCACertificateFile.
+##
+## Conversion done with mk-ca-bundle.pl version 1.27.
+## SHA256: dffa79e6aa993f558e82884abf7bb54bf440ab66ee91d82a27a627f6f2a4ace4
+##
+
+
+GlobalSign Root CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
+GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
+b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
+BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
+VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
+DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
+THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
+Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
+c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
+gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
+AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
+Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
+j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
+hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
+X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
+ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
+s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
+S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
+TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
+ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
+YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
+BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
+9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
+01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
+9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
+EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
+cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
+EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
+055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
+j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
+xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
+t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+Entrust.net Premium 2048 Secure Server CA
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
+ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
+bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
+BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
+NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
+d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
+MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
+ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
+Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
+hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
+nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
+VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
+KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
+T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
+zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
+J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
+nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
+-----END CERTIFICATE-----
+
+Baltimore CyberTrust Root
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
+ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
+ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
+SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
+dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
+uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
+UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
+G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
+XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
+l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
+VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
+BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
+cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
+hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
+Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
+RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+AddTrust Low-Value Services Root
+================================
+-----BEGIN CERTIFICATE-----
+MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
+cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
+CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
+ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
+54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
+oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
+Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
+GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
+HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
+AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
+RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
+HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
+ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
+iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
+eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
+mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
+ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
+-----END CERTIFICATE-----
+
+AddTrust External Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
+VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
+NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
+cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
+Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
+Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
+aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
+2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
+7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
+VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
+VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
+j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
+e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
+G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+AddTrust Public Services Root
+=============================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
+cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
+BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
+dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
+nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
+d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
+Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
+HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
+A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
+A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
+JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
+GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
+Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
+EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
+-----END CERTIFICATE-----
+
+AddTrust Qualified Certificates Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
+cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
+CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
+IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
+64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
+KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
+L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
+wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
+MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
+BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
+azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
+GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
+dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
+RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
+iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
+b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
+A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
+MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
+MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
+Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
+dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
+A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
+Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
+j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
+rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
+MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
+hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
+Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
+v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
+W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
+tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+GeoTrust Global CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
+MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
+BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
+8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
+T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
+vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
+DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
+zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
+d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
+mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
+XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
+Mw==
+-----END CERTIFICATE-----
+
+GeoTrust Global CA 2
+====================
+-----BEGIN CERTIFICATE-----
+MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
+MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
+NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
+LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
+Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
+HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
+K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
+srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
+ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
+OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
+x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
+H4z1Ir+rzoPz4iIprn2DQKi6bA==
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
+MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
+Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
+JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
+RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
+7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
+8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
+qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
+Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
+Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
+KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
+ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
+XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
+hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
+qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
+oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
+xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
+KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
+DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
+xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
+p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
+P/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA 2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
+MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
+SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
+DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
+j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
+JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
+QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
+WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
+20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
+ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
+SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
+8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
+BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
+4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
+A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
+Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
+pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
+FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
+gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
+X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+Visa eCommerce Root
+===================
+-----BEGIN CERTIFICATE-----
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
+EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
+QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
+WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
+VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
+F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
+RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
+TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
+/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
+GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
+MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
+CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
+YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
+zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
+YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
+-----END CERTIFICATE-----
+
+Certum Root CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
+ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
+Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
+by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
+wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
+kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
+89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
+Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
+NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
+hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
+GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
+GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
+0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
+qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
+-----END CERTIFICATE-----
+
+Comodo AAA Services root
+========================
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
+MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
+c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
+C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
+i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
+Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
+Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
+Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
+BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
+cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
+LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
+7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
+8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
+12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+Comodo Secure Services root
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
+MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
+Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
+BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
+9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
+rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
+oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
+p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
+FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
+gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
+YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
+aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
+4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
+Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
+DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
+pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
+RR3B7Hzs/Sk=
+-----END CERTIFICATE-----
+
+Comodo Trusted Services root
+============================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
+MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
+bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
+IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
+3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
+/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
+juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
+ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
+DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
+ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
+cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
+uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
+pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
+BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
+R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
+9y5Xt5hwXsjEeLBi
+-----END CERTIFICATE-----
+
+QuoVadis Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
+ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
+MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
+cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
+EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
+J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
+F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
+YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
+AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
+PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
+ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
+MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
+YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
+ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
+Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
+BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
+FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
+tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
+fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
+LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
+gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
+5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
+5nrQNiOKSnQ2+Q==
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
+ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
+XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
+lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
+lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
+lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
+66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
+wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
+D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
+BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
+J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
+DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
+a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
+Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
+UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
+VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
+IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
+WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
+f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
+4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
+VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3
+==================
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
+OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
+DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
+KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
+DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
+BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
+p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
+nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
+MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
+Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
+uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
+BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
+YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
+BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
+VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
+ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
+AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
+qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
+hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
+POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
+Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
+8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
+bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
+g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
+vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
+qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+Security Communication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
+8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
+DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
+5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
+DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
+JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
+0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
+mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
+s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
+6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
+FL39vmwLAw==
+-----END CERTIFICATE-----
+
+Sonera Class 2 Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
+U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
+NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
+IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
+/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
+dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
+f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
+tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
+nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
+XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
+0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
+cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
+Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
+EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
+llpwrN9M
+-----END CERTIFICATE-----
+
+UTN USERFirst Hardware Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
+BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
+OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
+eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
+ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
+wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
+tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
+i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
+Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
+gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
+lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
+UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
+BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
+//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
+XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
+lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
+iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
+nfhmqA==
+-----END CERTIFICATE-----
+
+Camerfirma Chambers of Commerce Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
+NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
+cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
+MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
+AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
+xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
+NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
+DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
+d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
+EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
+cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
+AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
+bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
+VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
+aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
+fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
+L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
+UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
+ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
+erfutGWaIZDgqtCYvDi1czyL+Nw=
+-----END CERTIFICATE-----
+
+Camerfirma Global Chambersign Root
+==================================
+-----BEGIN CERTIFICATE-----
+MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
+NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
+YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
+MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
+ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
+1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
+by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
+6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
+8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
+BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
+aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
+Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
+aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
+ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
+bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
+PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
+gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
+PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
+IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
+t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
+-----END CERTIFICATE-----
+
+XRamp Global CA Root
+====================
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
+BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
+dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
+HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
+U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
+IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
+foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
+zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
+AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
+xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
+oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
+AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
+/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
+nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
+8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+Go Daddy Class 2 CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
+VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
+A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
+RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
+ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
+2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
+qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
+YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
+vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
+BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
+atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
+MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
+A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
+PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
+I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
+Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
+vZ8=
+-----END CERTIFICATE-----
+
+Starfield Class 2 CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
+U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
+MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
+A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
+SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
+bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
+JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
+epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
+F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
+MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
+hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
+bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
+afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
+PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
+KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
+QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority
+================================
+-----BEGIN CERTIFICATE-----
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
+NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
+37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
+Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
+YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
+AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
+Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
+U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
+LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
+cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
+dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
+AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
+3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
+vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
+fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
+fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
+EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
+1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
+lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
+g14=
+-----END CERTIFICATE-----
+
+Taiwan GRCA
+===========
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
+EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
+DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
+dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
+w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
+BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
+1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
+htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
+J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
+Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
+B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
+O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
+lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
+HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
+09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
+Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
+Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
+D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
+DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
+Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
+7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
+CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
+-----END CERTIFICATE-----
+
+Swisscom Root CA 1
+==================
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
+EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
+dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
+MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
+aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
+IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
+MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
+NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
+AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
+b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
+7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
+cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
+WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
+haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
+MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
+BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
+MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
+jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
+MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
+VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
+vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
+OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
+1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
+nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
+x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
+NY6E0F/6MBr1mmz0DlP5OlvRHA==
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
+MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
+9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
+UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
+/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
+oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
+GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
+66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
+hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
+EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
+SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
+8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+DigiCert Global Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
+MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
+TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
+BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
+4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
+7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
+o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
+8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
+BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
+EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
+tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
+UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+DigiCert High Assurance EV Root CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
+KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
+MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
+MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
+Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
+Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
+OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
+MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
+NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
+h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
+Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
+JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
+V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
+myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
+mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
+-----END CERTIFICATE-----
+
+Certplus Class 2 Primary CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
+BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
+OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
+dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
+5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
+Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
+YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
+e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
+CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
+YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
+L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
+P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
+TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
+7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
+//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+
+DST Root CA X3
+==============
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
+ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
+DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
+cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
+rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
+UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
+xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
+utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
+MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
+dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
+GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
+RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
+fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+
+DST ACES CA X6
+==============
+-----BEGIN CERTIFICATE-----
+MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
+MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
+MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
+CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
+DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
+pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
+GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
+MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
+Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
+dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
+CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
+5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
+Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
+nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
+vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
+oKfN5XozNmr6mis=
+-----END CERTIFICATE-----
+
+SwissSign Gold CA - G2
+======================
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
+EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
+MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
+c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
+t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
+jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
+vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
+ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
+AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
+jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
+peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
+7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
+GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
+OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
+5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
+44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
+Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
+Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
+mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
+vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
+KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
+NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
+viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+SwissSign Silver CA - G2
+========================
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
+BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
+DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
+aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
+9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
+N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
+6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
+MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
+qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
+FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
+ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
+celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
+CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
+tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
+4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
+kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
+3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
+/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
+DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
+e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
+WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
+DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
+DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
+CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
+cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
+b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
+nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
+RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
+tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
+hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
+Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
+NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
+Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
+1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+thawte Primary Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
+MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
+SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
+KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
+FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
+oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
+1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
+q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
+aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
+afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
+AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
+uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
+jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
+z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G5
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
+biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
+dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
+j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
+Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
+Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
+fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
+BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
+Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
+SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
+KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
+Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
+ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+SecureTrust CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
+dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
+BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
+OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
+DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
+GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
+01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
+ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
+aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
+SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
+mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
+nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+Secure Global CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
+bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
+MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
+Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
+YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
+bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
+8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
+HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
+0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
+oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
+MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
+CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
+3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+COMODO Certification Authority
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
+MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
+T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
+xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
+4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
+1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
+rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
+b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
+AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
+OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
+IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
+-----END CERTIFICATE-----
+
+Network Solutions Certificate Authority
+=======================================
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
+EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
+IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
+MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
+jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
+aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
+crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
+/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
+AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
+bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
+A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
+4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
+GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
+ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+WellsSecure Public Root Certificate Authority
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
+F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
+NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
+MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
+bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
+VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
+iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
+i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
+bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
+K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
+AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
+cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
+lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
+i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
+GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
+K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
+bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
+qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
+E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
+tylv2G0xffX8oRAHh84vWdw+WNs=
+-----END CERTIFICATE-----
+
+COMODO ECC Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
+GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
+b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
+4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
+wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
+FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
+U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+Security Communication EV RootCA1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
+BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
+Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
+/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
+WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
+ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
+bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
+9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
+SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
+iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
+Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
+mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
+T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GA CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
+BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
+A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
+bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
+VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
+IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
+IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
+Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
+Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
+d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
+/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
+LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
+MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
+okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
+BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
+EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
+MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
+dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
+GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
+d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
+oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
+QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
+PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
+MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
+IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
+VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
+LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
+dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
+AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
+4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
+AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
+egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
+Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
+PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
+c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
+cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
+IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
+WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
+MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
+MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
+Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
+HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
+nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
+aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
+86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
+yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
+S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
+-----END CERTIFICATE-----
+
+Certigna
+========
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
+EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
+MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
+Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
+XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
+GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
+ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
+DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
+Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
+tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
+BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
+SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
+hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
+PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
+1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+Deutsche Telekom Root CA 2
+==========================
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
+RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
+A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
+MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
+A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
+b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
+bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
+KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
+AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
+Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
+jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
+HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
+E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
+zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
+rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
+dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+
+Cybertrust Global Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
+ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
+MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
+ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
+0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
+AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
+89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
+8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
+MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
+A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
+lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
+5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
+hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
+X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+ePKI Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
+EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
+Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
+MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
+MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
+IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
+lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
+qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
+12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
+WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
+lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
+vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
+Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
+MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
+1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
+KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
+xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
+NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
+GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
+xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
+gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
+sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
+BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
+=============================================================================================================================
+-----BEGIN CERTIFICATE-----
+MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
+DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
+aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
+b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
+BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
+S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
+MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
+IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
+n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
+IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
+dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
+cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
+Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
+xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
+6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
+hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
+BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
+N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
+y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
+LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
+dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
+-----END CERTIFICATE-----
+
+certSIGN ROOT CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
+VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
+Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
+CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
+JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
+rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
+ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
+0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
+AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
+Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
+AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
+SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
+x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
+vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
+TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+CNNIC ROOT
+==========
+-----BEGIN CERTIFICATE-----
+MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
+ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
+OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
+o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
+VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
+VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
+czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
+y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
+wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
+lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
+Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
+O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
+BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
+G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
+mxE=
+-----END CERTIFICATE-----
+
+ApplicationCA - Japanese Government
+===================================
+-----BEGIN CERTIFICATE-----
+MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
+SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
+MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
+cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
+fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
+wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
+jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
+nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
+WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
+BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
+vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
+o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
+/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
+io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
+dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
+rosot4LKGAfmt1t06SAZf7IbiVQ=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G3
+=============================================
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
+IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
+NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
+YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
+LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
+K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
+c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
+IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
+dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
+2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
+cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
+Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
+t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
+VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
+IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
+Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
+MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
+b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
+IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
+LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
+8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
+mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
+G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
+rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
+ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
+VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
+A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
+P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
+7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
+vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
+KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
+A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
+8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
+er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G2
+=============================================
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
+Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
+OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
+b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
+BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
+KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
+EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
+ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
+npaqBA+K
+-----END CERTIFICATE-----
+
+VeriSign Universal Root Certification Authority
+===============================================
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
+1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
+MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
+9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
+AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
+tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
+CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
+a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
+Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
+Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
+P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
+wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
+mJO37M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G4
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
+VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
+b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
+ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
+cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
+b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
+Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
+rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
+HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
+Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
+A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
+AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+
+NetLock Arany (Class Gold) Főtanúsítvány
+========================================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
+A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
+dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
+cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
+MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
+ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
+c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
+0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
+/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
+H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
+fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
+neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
+qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
+YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
+NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
+dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA - G2
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
+TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
+ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
+5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
+vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
+CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
+e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
+OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
+CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
+48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
+trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
+qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
+AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
+ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
+A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
++51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
+f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
+kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
+CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
+URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
+CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
+oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
+IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
+66+KAQ==
+-----END CERTIFICATE-----
+
+Hongkong Post Root CA 1
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
+DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
+NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
+IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
+ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
+auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
+qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
+V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
+HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
+h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
+l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
+IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
+T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
+c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
+-----END CERTIFICATE-----
+
+SecureSign RootCA11
+===================
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
+SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
+b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
+KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
+cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
+TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
+wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
+g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
+O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
+bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
+t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
+OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
+bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
+Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
+y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
+lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+
+ACEDICOM Root
+=============
+-----BEGIN CERTIFICATE-----
+MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
+T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
+MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
+A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
+WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
+YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
+MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
+m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
+HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
+xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
+3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
+2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
+TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
+4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
+9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
+bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
+aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
+eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
+zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
+ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
+KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
+nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
+I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
+MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
+tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
+MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
+c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
+BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
+U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
+fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
+0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
+pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
+1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
+AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
+QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
+FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
+lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
+I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
+yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
+LXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R3
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
+iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
+0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
+rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
+OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
+xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
+lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
+EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
+bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
+YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
+kpeDMdmztcpHWD9f
+-----END CERTIFICATE-----
+
+Autoridad de Certificacion Firmaprofesional CIF A62634068
+=========================================================
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
+BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
+MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
+QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
+NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
+Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
+B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
+7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
+ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
+plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
+MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
+LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
+bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
+vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
+EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
+DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
+bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
+ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
+51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
+R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
+T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
+Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
+osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
+crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
+saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
+KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
+6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+
+Izenpe.com
+==========
+-----BEGIN CERTIFICATE-----
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
+EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
+MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
+QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
+03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
+ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
+PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
+OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
+F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
+0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
+leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
+AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
+SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
+NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
+Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
+kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
+hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
+g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
+aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
+nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
+ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
+Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
+WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
+-----END CERTIFICATE-----
+
+Chambers of Commerce Root - 2008
+================================
+-----BEGIN CERTIFICATE-----
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
+Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
+ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
+EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
+cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
+XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
+h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
+ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
+NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
+D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
+lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
+0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
+EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
+G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
+BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
+bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
+bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
+CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
+AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
+wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
+3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
+RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
+M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
+YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
+9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
+zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
+nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
+-----END CERTIFICATE-----
+
+Global Chambersign Root - 2008
+==============================
+-----BEGIN CERTIFICATE-----
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
+NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
+Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
+QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
+aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
+VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
+XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
+ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
+/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
+TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
+H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
+Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
+HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
+AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
+BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
+BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
+aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
+aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
+1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
+dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
+/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
+ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
+dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
+9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
+foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
+qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
+P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
+c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
+-----END CERTIFICATE-----
+
+Go Daddy Root Certificate Authority - G2
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
+MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
+A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
+9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
+fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
+NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
+BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
+vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
+5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
+N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+Starfield Root Certificate Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
+eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
+DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
+VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
+dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
+W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
+bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
+N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
+ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
+JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
+TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
+4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
+F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
+c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+Starfield Services Root Certificate Authority - G2
+==================================================
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
+IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
+dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
+h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
+hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
+LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
+rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
+SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
+E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
+xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
+YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
+-----END CERTIFICATE-----
+
+AffirmTrust Commercial
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
+MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
+DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
+C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
+BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
+MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
+HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
+hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
+qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
+0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
+sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+AffirmTrust Networking
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
+MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
+Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
+dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
+/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
+h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
+HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
+UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
+12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
+WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
+/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+AffirmTrust Premium
+===================
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
+OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
+dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
+BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
+5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
+GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
+p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
+S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
+6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
+/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
+MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
+6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
+L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
+BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
+IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
+g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
+zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+AffirmTrust Premium ECC
+=======================
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
+BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
+MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
+cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
+N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
+BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
+BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
+57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
+eQ==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
+ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
+MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
+ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
+l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
+J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
+fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
+cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
+Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
+DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
+jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
+mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
+Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+Certinomis - Autorité Racine
+============================
+-----BEGIN CERTIFICATE-----
+MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
+Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
+LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
+A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
+JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
+wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
+Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
+2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
+jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
+c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
+lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
+xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
+530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
+4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
+KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
+WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
+R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
+nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
+CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
+JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
+qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
+WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
+wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
+vgt2Fl43N+bYdJeimUV5
+-----END CERTIFICATE-----
+
+TWCA Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
+VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
+EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
+IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
+QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
+oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
+4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
+y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
+9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
+mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
+QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
+T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
+Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+
+Security Communication RootCA2
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
+SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
+aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
+3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
+spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
+EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
+QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
+CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
+u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
+3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
+tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
+mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+
+EC-ACC
+======
+-----BEGIN CERTIFICATE-----
+MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
+BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
+ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
+VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
+CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
+BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
+MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
+SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
+Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
+cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
+w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
+ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
+HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
+E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
+0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
+VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
+Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
+dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
+lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
+Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
+l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
+E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
+5EI=
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions RootCA 2011
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
+O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
+aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
+AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
+IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
+1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
+71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
+8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
+3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
+MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
+MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
+b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
+XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
+/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
+7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
+-----END CERTIFICATE-----
+
+Actalis Authentication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
+BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
+AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
+MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
+IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
+IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
+wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
+by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
+zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
+YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
+oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
+EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
+hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
+EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
+jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
+iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
+ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
+WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
+JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
+K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
+Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
+4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
+2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
+lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
+OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
+vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
+-----END CERTIFICATE-----
+
+Trustis FPS Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
+EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
+IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
+BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
+RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
+H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
+cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
+o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
+AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
+BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
+GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
+yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
+8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
+l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
+iB6XzCGcKQENZetX2fNXlrtIzYE=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority
+================================
+-----BEGIN CERTIFICATE-----
+MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
+NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
+37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
+VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
+Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
+dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
+c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
+bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
+aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
+aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
+L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
+cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
+fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
+N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
+Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
+tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
+e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
+2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
+HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
+JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
+D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority G2
+===================================
+-----BEGIN CERTIFICATE-----
+MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE
+ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O
+o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG
+4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi
+Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul
+Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs
+O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H
+vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L
+nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS
+FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa
+z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ
+KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
+2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk
+J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+
+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG
+/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc
+nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld
+blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc
+l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm
+7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm
+obp573PYtlNXLfbQ4ddI
+-----END CERTIFICATE-----
+
+Buypass Class 2 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
+DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
+g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
+9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
+/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
+CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
+awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
+zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
+Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
+Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
+M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
+A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
+osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
+aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
+DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
+LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
+oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
+wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
+CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
+rJgWVqA=
+-----END CERTIFICATE-----
+
+Buypass Class 3 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
+DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
+sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
+5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
+7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
+ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
+2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
+/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
+RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
+Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
+j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
+cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
+uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
+Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
+ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
+KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
+6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
+UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
+eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
+Cp/HuZc=
+-----END CERTIFICATE-----
+
+T-TeleSec GlobalRoot Class 3
+============================
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
+MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
+9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
+NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
+iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
+0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
+AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
+fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
+ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
+P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
+-----END CERTIFICATE-----
+
+EE Certification Centre Root CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
+EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
+dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
+MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
+UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
+ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
+TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
+rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
+93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
+P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
+MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
+BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
+xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
+lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
+uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
+3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
+dcGWxZ0=
+-----END CERTIFICATE-----
+
+TURKTRUST Certificate Services Provider Root 2007
+=================================================
+-----BEGIN CERTIFICATE-----
+MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
+MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
+QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
+DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
+a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
+BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
+bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
+YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
+KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
+KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
+rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
+AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
+Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
+aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
+Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
+BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
+poRq0Tl9
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
+Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
+LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
+ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
+BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
+KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
+p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
+AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
+4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
+eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
+MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
+PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
+OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
+2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
+o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
+dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
+X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 EV 2009
+=================================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
+egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
+zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
+7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
+sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
+11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
+cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
+ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
+MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
+b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
+c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
+PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
+nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
+ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
+NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
+w9y4AyHqnxbxLFS1
+-----END CERTIFICATE-----
+
+PSCProcert
+==========
+-----BEGIN CERTIFICATE-----
+MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk
+ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ
+MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz
+dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl
+cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw
+IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw
+MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w
+DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD
+ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp
+Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC
+wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA
+3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh
+RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO
+EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2
+0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
+0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU
+td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw
+Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp
+r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/
+AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz
+Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId
+xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp
+ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH
+EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h
+Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k
+ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG
+9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG
+MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG
+LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52
+ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy
+YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
+Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o
+dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq
+T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN
+g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q
+uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1
+n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn
+FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo
+5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq
+3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5
+poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y
+eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
+-----END CERTIFICATE-----
+
+China Internet Network Information Center EV Certificates Root
+==============================================================
+-----BEGIN CERTIFICATE-----
+MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV
+BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D
+aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg
+Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG
+A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM
+PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl
+cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y
+jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV
+98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H
+klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23
+KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC
+7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD
+glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5
+0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM
+7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
+ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0
+5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8=
+-----END CERTIFICATE-----
+
+Swisscom Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG
+EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
+dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2
+MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
+aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC
+IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM
+LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo
+ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ
+wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH
+Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a
+SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS
+NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab
+mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY
+Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3
+qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O
+BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu
+MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO
+v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ
+82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz
+o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs
+a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx
+OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW
+mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o
++sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC
+rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX
+5OfNeOI5wSsSnqaeG8XmDtkx2Q==
+-----END CERTIFICATE-----
+
+Swisscom Root EV CA 2
+=====================
+-----BEGIN CERTIFICATE-----
+MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE
+BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl
+cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN
+MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT
+HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg
+Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz
+o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy
+Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti
+GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li
+qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH
+Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG
+alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa
+m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox
+bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi
+xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/
+BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED
+MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB
+bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL
+j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU
+wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7
+XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH
+59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/
+23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq
+J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA
+HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi
+uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW
+l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc=
+-----END CERTIFICATE-----
+
+CA Disig Root R1
+================
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw
+EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
+ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx
+EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
+c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy
+3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8
+u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2
+m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk
+CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa
+YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6
+vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL
+LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX
+ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is
+XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ
+04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR
+xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B
+LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM
+CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb
+VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85
+YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS
+ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix
+lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N
+UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ
+a7+h89n07eLw4+1knj0vllJPgFOL
+-----END CERTIFICATE-----
+
+CA Disig Root R2
+================
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw
+EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
+ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx
+EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
+c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC
+w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia
+xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7
+A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S
+GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV
+g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa
+5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE
+koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A
+Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i
+Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u
+Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
+tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV
+sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je
+dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8
+1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx
+mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01
+utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0
+sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg
+UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV
+7+ZtsH8tZ/3zbBt1RqPlShfppNcL
+-----END CERTIFICATE-----
+
+ACCVRAIZ1
+=========
+-----BEGIN CERTIFICATE-----
+MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
+SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
+MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
+UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
+jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
+RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
+aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
+0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
+WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
+8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
+5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
+9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
+Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
+Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
+Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
+VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
+Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
+QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
+AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
+YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
+AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
+IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
+aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
+dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
+MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
+hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
+R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
+YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
+nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
+TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
+sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
+I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
+Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
+3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
+EfbRD0tVNEYqi4Y7
+-----END CERTIFICATE-----
+
+TWCA Global Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
+CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
+QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
+EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
+Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
+nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
+r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
+Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
+tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
+KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
+sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
+yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
+kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
+zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
+cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
+LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
+8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
+/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
+lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
+A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
+i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
+EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
+zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
+-----END CERTIFICATE-----
+
+TeliaSonera Root CA v1
+======================
+-----BEGIN CERTIFICATE-----
+MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
+CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
+MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
+VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
+6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
+3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
+B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
+Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
+oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
+F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
+oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
+gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
+TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
+AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
+DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
+zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
+0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
+pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
+G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
+c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
+JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
+qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
+Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
+WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
+-----END CERTIFICATE-----
+
+E-Tugra Certification Authority
+===============================
+-----BEGIN CERTIFICATE-----
+MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
+DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
+ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
+ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
+NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
+QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
+cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
+DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
+hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
+CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
+ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
+BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
+E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
+rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
+jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
+rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
+dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
+/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
+MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
+kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
+XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
+VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
+a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
+dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
+KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
+Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
+8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
+C7TbO6Orb1wdtn7os4I07QZcJA==
+-----END CERTIFICATE-----
+
+T-TeleSec GlobalRoot Class 2
+============================
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
+MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
+SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
+vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
+2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
+WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
+YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
+r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
+vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
+3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
+9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
+-----END CERTIFICATE-----
+
+Atos TrustedRoot 2011
+=====================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
+cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
+MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
+A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
+hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
+54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
+HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
+z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
+l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
+bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
+CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
+k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
+TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
+61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
+3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 1 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE
+PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm
+PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6
+Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN
+ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l
+g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV
+7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX
+9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f
+iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg
+t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI
+hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
+MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3
+GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct
+Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP
++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh
+3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa
+wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6
+O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0
+FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV
+hMJKzRwuJIczYOXD
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh
+ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY
+NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t
+oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o
+MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l
+V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo
+L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ
+sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD
+6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh
+lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI
+hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
+AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K
+pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9
+x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz
+dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X
+U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw
+mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD
+zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN
+JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr
+O3jtZsSOeWmD3n+M
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286
+IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL
+Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe
+6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3
+I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U
+VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7
+5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi
+Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM
+dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt
+rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI
+hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
+KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS
+t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ
+TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du
+DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib
+Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD
+hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX
+0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW
+dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2
+PpxxVJkES/1Y+Zj0
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
+MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
+35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
+bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
+VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
+YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
+lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
+w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
+0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
+d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
+hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
+jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
+IhNzbM8m9Yop5w==
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
+VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
+MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
+BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
+RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
+KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
+UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
+YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
+1vUhZscv6pZjamVFkpUBtA==
+-----END CERTIFICATE-----
+
+DigiCert Global Root G2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
+MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
+kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
+3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
+BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
+UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
+5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
+F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
+WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
+QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
+iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
+MrY=
+-----END CERTIFICATE-----
+
+DigiCert Global Root G3
+=======================
+-----BEGIN CERTIFICATE-----
+MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
+VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
+MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
+aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
+AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
+YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
+Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
+3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
+VOKa5Vt8sycX
+-----END CERTIFICATE-----
+
+DigiCert Trusted Root G4
+========================
+-----BEGIN CERTIFICATE-----
+MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw
+HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
+MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp
+pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o
+k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa
+vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY
+QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6
+MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm
+mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7
+f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH
+dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8
+oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
+ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY
+ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr
+yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy
+7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah
+ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN
+5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb
+/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa
+5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK
+G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP
+82Z+
+-----END CERTIFICATE-----
+
+WoSign
+======
+-----BEGIN CERTIFICATE-----
+MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG
+EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g
+QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ
+BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
+vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO
+CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX
+2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5
+KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR
++ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez
+EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk
+lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2
+8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY
+yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C
+AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R
+8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1
+LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq
+T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj
+y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC
+2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes
+5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/
+EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh
+mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx
+kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi
+kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w==
+-----END CERTIFICATE-----
+
+WoSign China
+============
+-----BEGIN CERTIFICATE-----
+MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG
+EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv
+geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD
+VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k
+8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5
+uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85
+dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5
+Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy
+b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc
+76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m
++Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6
+yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX
+GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA
+A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6
+yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY
+r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115
+j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A
+kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97
+qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y
+jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB
+ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv
+T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO
+kI26oQ==
+-----END CERTIFICATE-----
+
+COMODO RSA Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn
+dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ
+FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+
+5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG
+x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX
+2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL
+OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3
+sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C
+GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5
+WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
+FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
+DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt
+rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+
+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg
+tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW
+sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp
+pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA
+zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq
+ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52
+7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I
+LaZRfyHBNVOFBkpdn627G190
+-----END CERTIFICATE-----
+
+USERTrust RSA Certification Authority
+=====================================
+-----BEGIN CERTIFICATE-----
+MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE
+BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
+ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE
+BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
+ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz
+0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j
+Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn
+RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O
++T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq
+/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE
+Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM
+lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8
+yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+
+eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
+BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW
+FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ
+7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ
+Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM
+8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi
+FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi
+yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c
+J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw
+sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx
+Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
+-----END CERTIFICATE-----
+
+USERTrust ECC Certification Authority
+=====================================
+-----BEGIN CERTIFICATE-----
+MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
+VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
+VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
+0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
+nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
+HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
+HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
+9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
+-----END CERTIFICATE-----
+
+GlobalSign ECC Root CA - R4
+===========================
+-----BEGIN CERTIFICATE-----
+MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl
+OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P
+AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV
+MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF
+JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=
+-----END CERTIFICATE-----
+
+GlobalSign ECC Root CA - R5
+===========================
+-----BEGIN CERTIFICATE-----
+MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
+SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
+h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
+uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
+yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA - G3
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC
+TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
+ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y
+olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t
+x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy
+EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K
+Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur
+mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5
+1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp
+07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo
+FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE
+41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB
+AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu
+yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
+U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq
+KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1
+v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA
+8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b
+8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r
+mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq
+1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI
+JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV
+tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk=
+-----END CERTIFICATE-----
+
+Staat der Nederlanden EV Root CA
+================================
+-----BEGIN CERTIFICATE-----
+MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M
+MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl
+cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk
+SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW
+O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r
+0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8
+Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV
+XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr
+08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV
+0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd
+74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx
+fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa
+ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
+eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu
+c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq
+5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN
+b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN
+f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi
+5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4
+WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK
+DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy
+eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
+-----END CERTIFICATE-----
+
+IdenTrust Commercial Root CA 1
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG
+EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS
+b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES
+MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB
+IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld
+hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/
+mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi
+1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C
+XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl
+3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy
+NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV
+WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg
+xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix
+uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI
+hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
+6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg
+ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt
+ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV
+YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX
+feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro
+kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe
+2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz
+Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R
+cGzM7vRX+Bi6hG6H
+-----END CERTIFICATE-----
+
+IdenTrust Public Sector Root CA 1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG
+EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv
+ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV
+UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS
+b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy
+P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6
+Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI
+rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf
+qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS
+mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn
+ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh
+LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v
+iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL
+4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B
+Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw
+DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
+t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A
+mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt
+GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt
+m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx
+NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4
+Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI
+ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC
+ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ
+3Wl9af0AVqW3rLatt8o+Ae+c
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
+bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
+b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
+HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
+DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
+OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
+/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
+HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
+s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
+TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
+AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
+0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
+iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
+Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
+nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
+e4pIb4tF9g==
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - EC1
+==========================================
+-----BEGIN CERTIFICATE-----
+MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
+FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
+YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
+ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
+FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
+LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
+dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
+IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
+AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
+9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
+vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
+kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
+-----END CERTIFICATE-----
+
+CFCA EV ROOT
+============
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE
+CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB
+IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw
+MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD
+DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV
+BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD
+7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN
+uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW
+ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7
+xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f
+py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K
+gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol
+hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ
+tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf
+BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
+ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q
+ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua
+4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG
+E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX
+BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn
+aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy
+PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX
+kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C
+ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
+-----END CERTIFICATE-----
+
+TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5
+====================================================
+-----BEGIN CERTIFICATE-----
+MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN
+BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
+bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg
+RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw
+ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w
+SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE
+n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp
+ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537
+jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m
+ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP
+9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV
+4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH
+HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
+hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo
+BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
+URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl
+lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8
+B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=
+-----END CERTIFICATE-----
+
+TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6
+====================================================
+-----BEGIN CERTIFICATE-----
+MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G
+A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
+acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5
+MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL
+BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf
+aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm
+aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a
+2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED
+wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb
+HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV
++DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT
+9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
+9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R
+fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy
+o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW
+hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1
+O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw==
+-----END CERTIFICATE-----
+
+Certinomis - Root CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
+Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg
+LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx
+EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD
+ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos
+P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo
+d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap
+z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00
+8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x
+RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE
+6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t
+FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV
+PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH
+i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj
+YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I
+6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF
+AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV
+WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw
+Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX
+lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ
+y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9
+Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng
+DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi
+I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM
+cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr
+hkIGuUE=
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GB CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
+EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
+ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
+MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
+VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
+b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
+scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
+rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
+9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
+Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
+GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
+hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
+dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
+VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
+HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
+Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
+-----END CERTIFICATE-----
+
+Certification Authority of WoSign G2
+====================================
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG
+EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx
+CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai
+XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du
+W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9
+5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK
+v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI
+hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY
+P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3
+TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu
++sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+
+7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg=
+-----END CERTIFICATE-----
+
+CA WoSign ECC Root
+==================
+-----BEGIN CERTIFICATE-----
+MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD
+TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v
+dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK
+ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI
+zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU
+t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw
+QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R
+MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0
+Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu
+a/GRspBl9JrmkO5K
+-----END CERTIFICATE-----
+
+SZAFIR ROOT CA2
+===============
+-----BEGIN CERTIFICATE-----
+MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
+A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
+BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
+BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
+VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
+qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
+DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
+2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
+ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
+ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
+AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
+AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
+O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
+oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
+4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA 2
+===========================
+-----BEGIN CERTIFICATE-----
+MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
+BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
+bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
+ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
+TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
+IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
+7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
+CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
+Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
+uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
+GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
+9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
+Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
+hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
+BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
+hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
+Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
+L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
+clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
+pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
+w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
+J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
+ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
+is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
+zAYspsbiDrW5viSP
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions RootCA 2015
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
+BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
+aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
+YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
+MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
+QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
+BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
+MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
+bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
+iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
+6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
+FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
+i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
+GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
+fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
+iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
+Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
+hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
+D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
+d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
+d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
+82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
+davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
+Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
+J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
+JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
+p/UsQu0yrbYhnr68
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions ECC RootCA 2015
+===========================================================
+-----BEGIN CERTIFICATE-----
+MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
+aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
+cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
+aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
+MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
+IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
+VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
+Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
+dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
+Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
+GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
+dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
+-----END CERTIFICATE-----
+
+Certplus Root CA G1
+===================
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUAMD4xCzAJBgNV
+BAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTAe
+Fw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhD
+ZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHN
+r49aiZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt6kuJPKNx
+Qv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP0FG7Yn2ksYyy/yARujVj
+BYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTv
+LRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDEEW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2
+z4QTd28n6v+WZxcIbekN1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc
+4nBvCGrch2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCTmehd
+4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV4EJQeIQEQWGw9CEj
+jy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPOWftwenMGE9nTdDckQQoRb5fc5+R+
+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0G
+A1UdDgQWBBSowcCbkahDFXxdBie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHY
+lwuBsTANBgkqhkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh
+66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7/SMNkPX0XtPG
+YX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BSS7CTKtQ+FjPlnsZlFT5kOwQ/
+2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F
+6ALEUz65noe8zDUa3qHpimOHZR4RKttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilX
+CNQ314cnrUlZp5GrRHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWe
+tUNy6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEVV/xuZDDC
+VRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5g4VCXA9DO2pJNdWY9BW/
++mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl++O/QmueD6i9a5jc2NvLi6Td11n0bt3+
+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=
+-----END CERTIFICATE-----
+
+Certplus Root CA G2
+===================
+-----BEGIN CERTIFICATE-----
+MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT
+AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x
+NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0
+cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA
+BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN
+Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD
+AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud
+IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV
+HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl
+vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw==
+-----END CERTIFICATE-----
+
+OpenTrust Root CA G1
+====================
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV
+BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcx
+MB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM
+CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7fa
+Yp6bwiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX/uMftk87
+ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR077F9jAHiOH3BX2pfJLKO
+YheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGPuY4zbGneWK2gDqdkVBFpRGZPTBKnjix9
+xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLxp2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO
+9z0M+Yo0FMT7MzUj8czxKselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq
+3ywgsNw2TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+WG+Oi
+n6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPwvFEVVJSmdz7QdFG9
+URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYYEQRVzXR7z2FwefR7LFxckvzluFqr
+TJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUl0YhVyE12jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/Px
+N3DlCPaTKbYwDQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E
+PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kfgLMtMrpkZ2Cv
+uVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbSFXJfLkur1J1juONI5f6ELlgK
+n0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLh
+X4SPgPL0DTatdrOjteFkdjpY3H1PXlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80
+nR14SohWZ25g/4/Ii+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcm
+GS3tTAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L9109S5zvE/
+bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/KyPu1svf0OnWZzsD2097+o
+4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJAwSQiumPv+i2tCqjI40cHLI5kqiPAlxA
+OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx
+-----END CERTIFICATE-----
+
+OpenTrust Root CA G2
+====================
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUAMEAxCzAJBgNV
+BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcy
+MB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM
+CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+
+Ntmh/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78eCbY2albz
+4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/61UWY0jUJ9gNDlP7ZvyCV
+eYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fEFY8ElggGQgT4hNYdvJGmQr5J1WqIP7wt
+UdGejeBSzFfdNTVY27SPJIjki9/ca1TSgSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz
+3GIZ38i1MH/1PCZ1Eb3XG7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj
+3CzMpSZyYhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaHvGOz
+9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4t/bQWVyJ98LVtZR0
+0dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/gh7PU3+06yzbXfZqfUAkBXKJOAGT
+y3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUajn6QiL35okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59
+M4PLuG53hq8wDQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz
+Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0nXGEL8pZ0keI
+mUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qTRmTFAHneIWv2V6CG1wZy7HBG
+S4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpTwm+bREx50B1ws9efAvSyB7DH5fitIw6mVskp
+EndI2S9G/Tvw/HRwkqWOOAgfZDC2t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ
+6e18CL13zSdkzJTaTkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97kr
+gCf2o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU3jg9CcCo
+SmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eAiN1nE28daCSLT7d0geX0
+YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14fWKGVyasvc0rQLW6aWQ9VGHgtPFGml4vm
+u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK
+-----END CERTIFICATE-----
+
+OpenTrust Root CA G3
+====================
+-----BEGIN CERTIFICATE-----
+MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT
+AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X
+DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w
+ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B
+ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB
+/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf
+BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM
+BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta
+3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB
+-----END CERTIFICATE-----
+
+ISRG Root X1
+============
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE
+BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD
+EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG
+EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT
+DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r
+Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1
+3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K
+b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN
+Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ
+4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf
+1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu
+hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH
+usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r
+OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G
+A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY
+9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV
+0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt
+hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw
+TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx
+e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA
+JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD
+YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n
+JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ
+m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
+-----END CERTIFICATE-----
+
+AC RAIZ FNMT-RCM
+================
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT
+AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw
+MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD
+TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
+ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf
+qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr
+btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL
+j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou
+08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw
+WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT
+tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ
+47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC
+ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa
+i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
+FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o
+dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
+nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s
+D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ
+j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT
+Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW
++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7
+Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d
+8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm
+5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG
+rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
+-----END CERTIFICATE-----
+
+Amazon Root CA 1
+================
+-----BEGIN CERTIFICATE-----
+MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD
+VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1
+MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
+bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH
+FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ
+gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t
+dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce
+VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3
+DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM
+CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy
+8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa
+2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2
+xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5
+-----END CERTIFICATE-----
+
+Amazon Root CA 2
+================
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD
+VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1
+MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
+bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
+ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4
+kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp
+N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9
+AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd
+fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx
+kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS
+btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0
+Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN
+c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+
+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw
+DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA
+A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE
+YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW
+xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ
+gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW
+aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV
+Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3
+KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi
+JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=
+-----END CERTIFICATE-----
+
+Amazon Root CA 3
+================
+-----BEGIN CERTIFICATE-----
+MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG
+EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy
+NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
+MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB
+f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr
+Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43
+rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc
+eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==
+-----END CERTIFICATE-----
+
+Amazon Root CA 4
+================
+-----BEGIN CERTIFICATE-----
+MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG
+EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy
+NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
+MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN
+/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri
+83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
+HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA
+MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1
+AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
+-----END CERTIFICATE-----
+
+LuxTrust Global Root 2
+======================
+-----BEGIN CERTIFICATE-----
+MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG
+A1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh
+bCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW
+MBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC
+AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm
+Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2
+xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC
+wGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm
+1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm
+FRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF
+wpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/
+a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U
+ubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ
+MC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB
+/zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5
+Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT
++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ
+FO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN
+H2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW
+7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu
+ZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA
+VWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR
+TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt
+/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc
+7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I
+iyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr
+-----END CERTIFICATE-----
diff --git a/twitter/vendor/abraham/twitteroauth/tests/AbstractSignatureMethodTest.php b/twitter/vendor/abraham/twitteroauth/tests/AbstractSignatureMethodTest.php
new file mode 100644 (file)
index 0000000..344b4c1
--- /dev/null
@@ -0,0 +1,51 @@
+<?php
+
+namespace Abraham\TwitterOAuth\Tests;
+
+use Abraham\TwitterOAuth\SignatureMethod;
+
+abstract class AbstractSignatureMethodTest extends \PHPUnit_Framework_TestCase
+{
+    protected $name;
+
+    /**
+     * @return SignatureMethod
+     */
+    abstract public function getClass();
+
+    abstract protected function signatureDataProvider();
+
+    public function testGetName()
+    {
+        $this->assertEquals($this->name, $this->getClass()->getName());
+    }
+
+    /**
+     * @dataProvider signatureDataProvider
+     */
+    public function testBuildSignature($expected, $request, $consumer, $token)
+    {
+        $this->assertEquals($expected, $this->getClass()->buildSignature($request, $consumer, $token));
+    }
+
+    protected function getRequest()
+    {
+        return $this->getMockBuilder('Abraham\TwitterOAuth\Request')
+            ->disableOriginalConstructor()
+            ->getMock();
+    }
+
+    protected function getConsumer($key = null, $secret = null, $callbackUrl = null)
+    {
+        return $this->getMockBuilder('Abraham\TwitterOAuth\Consumer')
+            ->setConstructorArgs([$key, $secret, $callbackUrl])
+            ->getMock();
+    }
+
+    protected function getToken($key = null, $secret = null)
+    {
+        return $this->getMockBuilder('Abraham\TwitterOAuth\Token')
+            ->setConstructorArgs([$key, $secret])
+            ->getMock();
+    }
+}
diff --git a/twitter/vendor/abraham/twitteroauth/tests/ConsumerTest.php b/twitter/vendor/abraham/twitteroauth/tests/ConsumerTest.php
new file mode 100644 (file)
index 0000000..3ec810a
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+namespace Abraham\TwitterOAuth\Tests;
+
+use Abraham\TwitterOAuth\Consumer;
+
+class ConsumerTest extends \PHPUnit_Framework_TestCase {
+    public function testToString()
+    {
+        $key = uniqid();
+        $secret = uniqid();
+        $consumer = new Consumer($key, $secret);
+
+        $this->assertEquals("Consumer[key=$key,secret=$secret]", $consumer->__toString());
+    }
+}
\ No newline at end of file
diff --git a/twitter/vendor/abraham/twitteroauth/tests/HmacSha1Test.php b/twitter/vendor/abraham/twitteroauth/tests/HmacSha1Test.php
new file mode 100644 (file)
index 0000000..cf37a22
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+
+namespace Abraham\TwitterOAuth\Tests;
+
+use Abraham\TwitterOAuth\HmacSha1;
+
+class HmacSha1Test extends AbstractSignatureMethodTest
+{
+    protected $name = 'HMAC-SHA1';
+
+    public function getClass()
+    {
+        return new HmacSha1();
+    }
+
+    public function signatureDataProvider()
+    {
+        return [
+            ['5CoEcoq7XoKFjwYCieQvuzadeUA=', $this->getRequest(), $this->getConsumer(), $this->getToken()],
+            [
+                'EBw0gHngam3BTx8kfPfNNSyKem4=',
+                $this->getRequest(),
+                $this->getConsumer('key', 'secret'),
+                $this->getToken()
+            ],
+            [
+                'kDsHFZzws2a5M6cAQjfpdNBo+v8=',
+                $this->getRequest(),
+                $this->getConsumer('key', 'secret'),
+                $this->getToken('key', 'secret')
+            ],
+            ['EBw0gHngam3BTx8kfPfNNSyKem4=', $this->getRequest(), $this->getConsumer('key', 'secret'), null],
+        ];
+    }
+}
\ No newline at end of file
diff --git a/twitter/vendor/abraham/twitteroauth/tests/TokenTest.php b/twitter/vendor/abraham/twitteroauth/tests/TokenTest.php
new file mode 100644 (file)
index 0000000..5be372b
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+
+namespace Abraham\TwitterOAuth\Tests;
+
+use Abraham\TwitterOAuth\Token;
+
+class TokenTest extends \PHPUnit_Framework_TestCase {
+    /**
+     * @dataProvider tokenProvider
+     */
+    public function testToString($expected, $key, $secret)
+    {
+        $token = new Token($key, $secret);
+
+        $this->assertEquals($expected, $token->__toString());
+    }
+
+    public function tokenProvider()
+    {
+        return [
+            ['oauth_token=key&oauth_token_secret=secret', 'key', 'secret'],
+            ['oauth_token=key%2Bkey&oauth_token_secret=secret', 'key+key', 'secret'],
+            ['oauth_token=key~key&oauth_token_secret=secret', 'key~key', 'secret'],
+        ];
+    }
+}
\ No newline at end of file
diff --git a/twitter/vendor/abraham/twitteroauth/tests/TwitterOAuthTest.php b/twitter/vendor/abraham/twitteroauth/tests/TwitterOAuthTest.php
new file mode 100644 (file)
index 0000000..730bd34
--- /dev/null
@@ -0,0 +1,256 @@
+<?php
+/**
+ * WARNING: Running these tests will post and delete through the actual Twitter account.
+ */
+namespace Abraham\TwitterOAuth\Test;
+
+use Abraham\TwitterOAuth\TwitterOAuth;
+
+class TwitterOAuthTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var TwitterOAuth */
+    protected $twitter;
+
+    protected function setUp()
+    {
+        $this->twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
+    }
+
+    public function testBuildClient()
+    {
+        $this->assertObjectHasAttribute('consumer', $this->twitter);
+        $this->assertObjectHasAttribute('token', $this->twitter);
+    }
+
+    public function testSetOauthToken()
+    {
+        $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
+        $twitter->setOauthToken(ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
+        $this->assertObjectHasAttribute('consumer', $twitter);
+        $this->assertObjectHasAttribute('token', $twitter);
+        $twitter->get('friendships/show', ['target_screen_name' => 'twitterapi']);
+        $this->assertEquals(200, $twitter->getLastHttpCode());
+    }
+
+    public function testOauth2Token()
+    {
+        $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
+        $result = $twitter->oauth2('oauth2/token', ['grant_type' => 'client_credentials']);
+        $this->assertEquals(200, $twitter->getLastHttpCode());
+        $this->assertObjectHasAttribute('token_type', $result);
+        $this->assertObjectHasAttribute('access_token', $result);
+        $this->assertEquals('bearer', $result->token_type);
+        return $result;
+    }
+
+    /**
+     * @depends testOauth2Token
+     */
+    public function testBearerToken($accessToken)
+    {
+        $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, null, $accessToken->access_token);
+        $result = $twitter->get('statuses/user_timeline', ['screen_name' => 'twitterapi']);
+        if ($twitter->getLastHttpCode() !== 200) {
+            $this->assertEquals('foo', substr($accessToken->access_token, 0, 75));
+            $this->assertEquals('foo', print_r($result, true));
+        }
+        $this->assertEquals(200, $twitter->getLastHttpCode());
+        return $accessToken;
+    }
+
+    // This causes issues for parallel run tests.
+    // /**
+    //  * @depends testBearerToken
+    //  */
+    // public function testOauth2TokenInvalidate($accessToken)
+    // {
+    //     $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
+    //     // HACK: access_token is already urlencoded but gets urlencoded again breaking the invalidate request.
+    //     $result = $twitter->oauth2(
+    //         'oauth2/invalidate_token',
+    //         array('access_token' => urldecode($accessToken->access_token))
+    //     );
+    //     $this->assertEquals(200, $twitter->getLastHttpCode());
+    //     $this->assertObjectHasAttribute('access_token', $result);
+    //     return $result;
+    // }
+
+    public function testOauthRequestToken()
+    {
+        $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
+        $result = $twitter->oauth('oauth/request_token', ['oauth_callback' => OAUTH_CALLBACK]);
+        $this->assertEquals(200, $twitter->getLastHttpCode());
+        $this->assertArrayHasKey('oauth_token', $result);
+        $this->assertArrayHasKey('oauth_token_secret', $result);
+        $this->assertArrayHasKey('oauth_callback_confirmed', $result);
+        $this->assertEquals('true', $result['oauth_callback_confirmed']);
+        return $result;
+    }
+
+    /**
+     * @expectedException \Abraham\TwitterOAuth\TwitterOAuthException
+     * @expectedExceptionMessage Could not authenticate you
+     */
+    public function testOauthRequestTokenException()
+    {
+        $twitter = new TwitterOAuth('CONSUMER_KEY', 'CONSUMER_SECRET');
+        $result = $twitter->oauth('oauth/request_token', ['oauth_callback' => OAUTH_CALLBACK]);
+        return $result;
+    }
+
+    /**
+     * @expectedException \Abraham\TwitterOAuth\TwitterOAuthException
+     * @expectedExceptionMessage Invalid oauth_verifier parameter
+     * @depends testOauthRequestToken
+     */
+    public function testOauthAccessTokenTokenException(array $requestToken)
+    {
+        // Can't test this without a browser logging into Twitter so check for the correct error instead.
+        $twitter = new TwitterOAuth(
+            CONSUMER_KEY,
+            CONSUMER_SECRET,
+            $requestToken['oauth_token'],
+            $requestToken['oauth_token_secret']
+        );
+        $twitter->oauth("oauth/access_token", ["oauth_verifier" => "fake_oauth_verifier"]);
+    }
+
+    public function testUrl()
+    {
+        $url = $this->twitter->url('oauth/authorize', ['foo' => 'bar', 'baz' => 'qux']);
+        $this->assertEquals('https://api.twitter.com/oauth/authorize?foo=bar&baz=qux', $url);
+    }
+
+    public function testGetAccountVerifyCredentials()
+    {
+        // Include entities boolean added to test parameter value cohearsion
+        $this->twitter->get('account/verify_credentials', ["include_entities" => false]);
+        $this->assertEquals(200, $this->twitter->getLastHttpCode());
+    }
+
+    // BUG: testing is too unreliable for now
+    // public function testSetProxy()
+    // {
+    //     $this->twitter->setProxy(array(
+    //         'CURLOPT_PROXY' => PROXY,
+    //         'CURLOPT_PROXYUSERPWD' => PROXYUSERPWD,
+    //         'CURLOPT_PROXYPORT' => PROXYPORT,
+    //     ));
+    //     $this->twitter->setTimeouts(60, 60);
+    //     $result = $this->twitter->get('account/verify_credentials');
+    //     $this->assertEquals(200, $this->twitter->getLastHttpCode());
+    //     $this->assertObjectHasAttribute('id', $result);
+    // }
+
+    public function testGetStatusesMentionsTimeline()
+    {
+        $this->twitter->get('statuses/mentions_timeline');
+        $this->assertEquals(200, $this->twitter->getLastHttpCode());
+    }
+
+    public function testGetSearchTweets()
+    {
+        $result = $this->twitter->get('search/tweets', ['q' => 'twitter']);
+        $this->assertEquals(200, $this->twitter->getLastHttpCode());
+        return $result->statuses;
+    }
+
+    /**
+     * @depends testGetSearchTweets
+     */
+    public function testGetSearchTweetsWithMaxId($statuses)
+    {
+        $maxId = array_pop($statuses)->id_str;
+        $this->twitter->get('search/tweets', ['q' => 'twitter', 'max_id' => $maxId]);
+        $this->assertEquals(200, $this->twitter->getLastHttpCode());
+    }
+
+    public function testPostFavoritesCreate()
+    {
+        $result = $this->twitter->post('favorites/create', ['id' => '6242973112']);
+        if ($this->twitter->getLastHttpCode() == 403) {
+            // Status already favorited
+            $this->assertEquals(139, $result->errors[0]->code);
+        } else {
+            $this->assertEquals(200, $this->twitter->getLastHttpCode());
+        }
+    }
+
+    /**
+     * @depends testPostFavoritesCreate
+     */
+    public function testPostFavoritesDestroy()
+    {
+        $this->twitter->post('favorites/destroy', ['id' => '6242973112']);
+        $this->assertEquals(200, $this->twitter->getLastHttpCode());
+    }
+
+    public function testPostStatusesUpdateWithMedia()
+    {
+        $this->twitter->setTimeouts(60, 30);
+        // Image source https://www.flickr.com/photos/titrans/8548825587/
+        $file_path = __DIR__ . '/kitten.jpg';
+        $result = $this->twitter->upload('media/upload', ['media' => $file_path]);
+        $this->assertEquals(200, $this->twitter->getLastHttpCode());
+        $this->assertObjectHasAttribute('media_id_string', $result);
+        $parameters = ['status' => 'Hello World ' . time(), 'media_ids' => $result->media_id_string];
+        $result = $this->twitter->post('statuses/update', $parameters);
+        $this->assertEquals(200, $this->twitter->getLastHttpCode());
+        if ($this->twitter->getLastHttpCode() == 200) {
+            $result = $this->twitter->post('statuses/destroy/' . $result->id_str);
+        }
+        return $result;
+    }
+
+    public function testPostStatusesUpdateWithMediaChunked()
+    {
+        $this->twitter->setTimeouts(60, 30);
+        // Video source http://www.sample-videos.com/
+        $file_path = __DIR__ . '/video.mp4';
+        $result = $this->twitter->upload('media/upload', ['media' => $file_path, 'media_type' => 'video/mp4'], true);
+        $this->assertEquals(201, $this->twitter->getLastHttpCode());
+        $this->assertObjectHasAttribute('media_id_string', $result);
+        $parameters = ['status' => 'Hello World ' . time(), 'media_ids' => $result->media_id_string];
+        $result = $this->twitter->post('statuses/update', $parameters);
+        $this->assertEquals(200, $this->twitter->getLastHttpCode());
+        if ($this->twitter->getLastHttpCode() == 200) {
+            $result = $this->twitter->post('statuses/destroy/' . $result->id_str);
+        }
+        return $result;
+    }
+
+    public function testPostStatusesUpdateUtf8()
+    {
+        $result = $this->twitter->post('statuses/update', ['status' => 'xこんにちは世界 ' . time()]);
+        $this->assertEquals(200, $this->twitter->getLastHttpCode());
+        return $result;
+    }
+
+    /**
+     * @depends testPostStatusesUpdateUtf8
+     */
+    public function testPostStatusesDestroy($status)
+    {
+        $this->twitter->post('statuses/destroy/' . $status->id_str);
+        $this->assertEquals(200, $this->twitter->getLastHttpCode());
+    }
+
+    public function testLastResult()
+    {
+        $this->twitter->get('search/tweets', ['q' => 'twitter']);
+        $this->assertEquals('search/tweets', $this->twitter->getLastApiPath());
+        $this->assertEquals(200, $this->twitter->getLastHttpCode());
+        $this->assertObjectHasAttribute('statuses', $this->twitter->getLastBody());
+    }
+
+    /**
+     * @depends testLastResult
+     */
+    public function testResetLastResponse()
+    {
+        $this->twitter->resetLastResponse();
+        $this->assertEquals('', $this->twitter->getLastApiPath());
+        $this->assertEquals(0, $this->twitter->getLastHttpCode());
+        $this->assertEquals([], $this->twitter->getLastBody());
+    }
+}
diff --git a/twitter/vendor/abraham/twitteroauth/tests/Util/JsonDecoderTest.php b/twitter/vendor/abraham/twitteroauth/tests/Util/JsonDecoderTest.php
new file mode 100644 (file)
index 0000000..609382d
--- /dev/null
@@ -0,0 +1,50 @@
+<?php
+
+namespace Abraham\TwitterOAuth\Tests;
+
+use Abraham\TwitterOAuth\Util\JsonDecoder;
+
+class JsonDecoderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider jsonProvider
+     */
+    public function testDecode($input, $asArray, $expected)
+    {
+        $this->assertEquals($expected, JsonDecoder::decode($input, $asArray));
+    }
+
+    public function jsonProvider()
+    {
+        return [
+            ['[]', true, []],
+            ['[1,2,3]', true, [1, 2, 3]],
+            ['[{"id": 556179961825226750}]', true, [['id' => 556179961825226750]]],
+            ['[]', false, []],
+            ['[1,2,3]', false, [1, 2, 3]],
+            [
+                '[{"id": 556179961825226750}]',
+                false,
+                [
+                    $this->getClass(function ($object) {
+                        $object->id = 556179961825226750;
+                        return $object;
+                    })
+                ]
+            ],
+
+        ];
+    }
+
+    /**
+     * @param callable $callable
+     *
+     * @return stdClass
+     */
+    private function getClass(\Closure $callable)
+    {
+        $object = new \stdClass();
+
+        return $callable($object);
+    }
+}
diff --git a/twitter/vendor/abraham/twitteroauth/tests/bootstrap.php b/twitter/vendor/abraham/twitteroauth/tests/bootstrap.php
new file mode 100644 (file)
index 0000000..7cc9c27
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+
+require __DIR__ . '/../vendor/autoload.php';
+
+define('CONSUMER_KEY', getenv('TEST_CONSUMER_KEY'));
+define('CONSUMER_SECRET', getenv('TEST_CONSUMER_SECRET'));
+define('ACCESS_TOKEN', getenv('TEST_ACCESS_TOKEN'));
+define('ACCESS_TOKEN_SECRET', getenv('TEST_ACCESS_TOKEN_SECRET'));
+define('OAUTH_CALLBACK', getenv('TEST_OAUTH_CALLBACK'));
+define('PROXY', getenv('TEST_CURLOPT_PROXY'));
+define('PROXYUSERPWD', getenv('TEST_CURLOPT_PROXYUSERPWD'));
+define('PROXYPORT', getenv('TEST_CURLOPT_PROXYPORT'));
diff --git a/twitter/vendor/abraham/twitteroauth/tests/kitten.jpg b/twitter/vendor/abraham/twitteroauth/tests/kitten.jpg
new file mode 100644 (file)
index 0000000..47006b4
Binary files /dev/null and b/twitter/vendor/abraham/twitteroauth/tests/kitten.jpg differ
diff --git a/twitter/vendor/abraham/twitteroauth/tests/sample_env b/twitter/vendor/abraham/twitteroauth/tests/sample_env
new file mode 100644 (file)
index 0000000..64e07fd
--- /dev/null
@@ -0,0 +1,13 @@
+# WARNING: Running the tests will perform live actions as the Twitter account.
+# Set all values, move to `env`, run `source tests/env` and `phpunit` to start testing.
+
+# To run the tests you must register Twitter application at https://app.twitter.com/.
+export TEST_CONSUMER_KEY=
+export TEST_CONSUMER_SECRET=
+export TEST_ACCESS_TOKEN=
+export TEST_ACCESS_TOKEN_SECRET=
+export TEST_OAUTH_CALLBACK=
+# You can find proxies for testing at http://proxylist.hidemyass.com/.
+export TEST_CURLOPT_PROXY=
+export TEST_CURLOPT_PROXYUSERPWD=
+export TEST_CURLOPT_PROXYPORT=
diff --git a/twitter/vendor/abraham/twitteroauth/tests/video.mp4 b/twitter/vendor/abraham/twitteroauth/tests/video.mp4
new file mode 100644 (file)
index 0000000..1fc4788
Binary files /dev/null and b/twitter/vendor/abraham/twitteroauth/tests/video.mp4 differ
diff --git a/twitter/vendor/autoload.php b/twitter/vendor/autoload.php
new file mode 100644 (file)
index 0000000..7c8eabe
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+// autoload.php @generated by Composer
+
+require_once __DIR__ . '/composer/autoload_real.php';
+
+return ComposerAutoloaderInitd051a3fd38373f38066f9a7f62be4c25::getLoader();
diff --git a/twitter/vendor/composer/ClassLoader.php b/twitter/vendor/composer/ClassLoader.php
new file mode 100644 (file)
index 0000000..dc02dfb
--- /dev/null
@@ -0,0 +1,445 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ *     $loader = new \Composer\Autoload\ClassLoader();
+ *
+ *     // register classes with namespaces
+ *     $loader->add('Symfony\Component', __DIR__.'/component');
+ *     $loader->add('Symfony',           __DIR__.'/framework');
+ *
+ *     // activate the autoloader
+ *     $loader->register();
+ *
+ *     // to enable searching the include path (eg. for PEAR packages)
+ *     $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @see    http://www.php-fig.org/psr/psr-0/
+ * @see    http://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+    // PSR-4
+    private $prefixLengthsPsr4 = array();
+    private $prefixDirsPsr4 = array();
+    private $fallbackDirsPsr4 = array();
+
+    // PSR-0
+    private $prefixesPsr0 = array();
+    private $fallbackDirsPsr0 = array();
+
+    private $useIncludePath = false;
+    private $classMap = array();
+    private $classMapAuthoritative = false;
+    private $missingClasses = array();
+    private $apcuPrefix;
+
+    public function getPrefixes()
+    {
+        if (!empty($this->prefixesPsr0)) {
+            return call_user_func_array('array_merge', $this->prefixesPsr0);
+        }
+
+        return array();
+    }
+
+    public function getPrefixesPsr4()
+    {
+        return $this->prefixDirsPsr4;
+    }
+
+    public function getFallbackDirs()
+    {
+        return $this->fallbackDirsPsr0;
+    }
+
+    public function getFallbackDirsPsr4()
+    {
+        return $this->fallbackDirsPsr4;
+    }
+
+    public function getClassMap()
+    {
+        return $this->classMap;
+    }
+
+    /**
+     * @param array $classMap Class to filename map
+     */
+    public function addClassMap(array $classMap)
+    {
+        if ($this->classMap) {
+            $this->classMap = array_merge($this->classMap, $classMap);
+        } else {
+            $this->classMap = $classMap;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix, either
+     * appending or prepending to the ones previously set for this prefix.
+     *
+     * @param string       $prefix  The prefix
+     * @param array|string $paths   The PSR-0 root directories
+     * @param bool         $prepend Whether to prepend the directories
+     */
+    public function add($prefix, $paths, $prepend = false)
+    {
+        if (!$prefix) {
+            if ($prepend) {
+                $this->fallbackDirsPsr0 = array_merge(
+                    (array) $paths,
+                    $this->fallbackDirsPsr0
+                );
+            } else {
+                $this->fallbackDirsPsr0 = array_merge(
+                    $this->fallbackDirsPsr0,
+                    (array) $paths
+                );
+            }
+
+            return;
+        }
+
+        $first = $prefix[0];
+        if (!isset($this->prefixesPsr0[$first][$prefix])) {
+            $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+            return;
+        }
+        if ($prepend) {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                (array) $paths,
+                $this->prefixesPsr0[$first][$prefix]
+            );
+        } else {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                $this->prefixesPsr0[$first][$prefix],
+                (array) $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace, either
+     * appending or prepending to the ones previously set for this namespace.
+     *
+     * @param string       $prefix  The prefix/namespace, with trailing '\\'
+     * @param array|string $paths   The PSR-4 base directories
+     * @param bool         $prepend Whether to prepend the directories
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function addPsr4($prefix, $paths, $prepend = false)
+    {
+        if (!$prefix) {
+            // Register directories for the root namespace.
+            if ($prepend) {
+                $this->fallbackDirsPsr4 = array_merge(
+                    (array) $paths,
+                    $this->fallbackDirsPsr4
+                );
+            } else {
+                $this->fallbackDirsPsr4 = array_merge(
+                    $this->fallbackDirsPsr4,
+                    (array) $paths
+                );
+            }
+        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+            // Register directories for a new namespace.
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+        } elseif ($prepend) {
+            // Prepend directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                (array) $paths,
+                $this->prefixDirsPsr4[$prefix]
+            );
+        } else {
+            // Append directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                $this->prefixDirsPsr4[$prefix],
+                (array) $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix,
+     * replacing any others previously set for this prefix.
+     *
+     * @param string       $prefix The prefix
+     * @param array|string $paths  The PSR-0 base directories
+     */
+    public function set($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr0 = (array) $paths;
+        } else {
+            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace,
+     * replacing any others previously set for this namespace.
+     *
+     * @param string       $prefix The prefix/namespace, with trailing '\\'
+     * @param array|string $paths  The PSR-4 base directories
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function setPsr4($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr4 = (array) $paths;
+        } else {
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Turns on searching the include path for class files.
+     *
+     * @param bool $useIncludePath
+     */
+    public function setUseIncludePath($useIncludePath)
+    {
+        $this->useIncludePath = $useIncludePath;
+    }
+
+    /**
+     * Can be used to check if the autoloader uses the include path to check
+     * for classes.
+     *
+     * @return bool
+     */
+    public function getUseIncludePath()
+    {
+        return $this->useIncludePath;
+    }
+
+    /**
+     * Turns off searching the prefix and fallback directories for classes
+     * that have not been registered with the class map.
+     *
+     * @param bool $classMapAuthoritative
+     */
+    public function setClassMapAuthoritative($classMapAuthoritative)
+    {
+        $this->classMapAuthoritative = $classMapAuthoritative;
+    }
+
+    /**
+     * Should class lookup fail if not found in the current class map?
+     *
+     * @return bool
+     */
+    public function isClassMapAuthoritative()
+    {
+        return $this->classMapAuthoritative;
+    }
+
+    /**
+     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+     *
+     * @param string|null $apcuPrefix
+     */
+    public function setApcuPrefix($apcuPrefix)
+    {
+        $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
+    }
+
+    /**
+     * The APCu prefix in use, or null if APCu caching is not enabled.
+     *
+     * @return string|null
+     */
+    public function getApcuPrefix()
+    {
+        return $this->apcuPrefix;
+    }
+
+    /**
+     * Registers this instance as an autoloader.
+     *
+     * @param bool $prepend Whether to prepend the autoloader or not
+     */
+    public function register($prepend = false)
+    {
+        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+    }
+
+    /**
+     * Unregisters this instance as an autoloader.
+     */
+    public function unregister()
+    {
+        spl_autoload_unregister(array($this, 'loadClass'));
+    }
+
+    /**
+     * Loads the given class or interface.
+     *
+     * @param  string    $class The name of the class
+     * @return bool|null True if loaded, null otherwise
+     */
+    public function loadClass($class)
+    {
+        if ($file = $this->findFile($class)) {
+            includeFile($file);
+
+            return true;
+        }
+    }
+
+    /**
+     * Finds the path to the file where the class is defined.
+     *
+     * @param string $class The name of the class
+     *
+     * @return string|false The path if found, false otherwise
+     */
+    public function findFile($class)
+    {
+        // class map lookup
+        if (isset($this->classMap[$class])) {
+            return $this->classMap[$class];
+        }
+        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
+            return false;
+        }
+        if (null !== $this->apcuPrefix) {
+            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+            if ($hit) {
+                return $file;
+            }
+        }
+
+        $file = $this->findFileWithExtension($class, '.php');
+
+        // Search for Hack files if we are running on HHVM
+        if (false === $file && defined('HHVM_VERSION')) {
+            $file = $this->findFileWithExtension($class, '.hh');
+        }
+
+        if (null !== $this->apcuPrefix) {
+            apcu_add($this->apcuPrefix.$class, $file);
+        }
+
+        if (false === $file) {
+            // Remember that this class does not exist.
+            $this->missingClasses[$class] = true;
+        }
+
+        return $file;
+    }
+
+    private function findFileWithExtension($class, $ext)
+    {
+        // PSR-4 lookup
+        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+        $first = $class[0];
+        if (isset($this->prefixLengthsPsr4[$first])) {
+            $subPath = $class;
+            while (false !== $lastPos = strrpos($subPath, '\\')) {
+                $subPath = substr($subPath, 0, $lastPos);
+                $search = $subPath.'\\';
+                if (isset($this->prefixDirsPsr4[$search])) {
+                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
+                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
+                        if (file_exists($file = $dir . $pathEnd)) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-4 fallback dirs
+        foreach ($this->fallbackDirsPsr4 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 lookup
+        if (false !== $pos = strrpos($class, '\\')) {
+            // namespaced class name
+            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+        } else {
+            // PEAR-like class name
+            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+        }
+
+        if (isset($this->prefixesPsr0[$first])) {
+            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+                if (0 === strpos($class, $prefix)) {
+                    foreach ($dirs as $dir) {
+                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-0 fallback dirs
+        foreach ($this->fallbackDirsPsr0 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 include paths.
+        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+            return $file;
+        }
+
+        return false;
+    }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ */
+function includeFile($file)
+{
+    include $file;
+}
diff --git a/twitter/vendor/composer/LICENSE b/twitter/vendor/composer/LICENSE
new file mode 100644 (file)
index 0000000..f27399a
--- /dev/null
@@ -0,0 +1,21 @@
+
+Copyright (c) Nils Adermann, Jordi Boggiano
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff --git a/twitter/vendor/composer/autoload_classmap.php b/twitter/vendor/composer/autoload_classmap.php
new file mode 100644 (file)
index 0000000..7a91153
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_classmap.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);
diff --git a/twitter/vendor/composer/autoload_namespaces.php b/twitter/vendor/composer/autoload_namespaces.php
new file mode 100644 (file)
index 0000000..b7fc012
--- /dev/null
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_namespaces.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);
diff --git a/twitter/vendor/composer/autoload_psr4.php b/twitter/vendor/composer/autoload_psr4.php
new file mode 100644 (file)
index 0000000..55eed14
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+
+// autoload_psr4.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+    'Abraham\\TwitterOAuth\\' => array($vendorDir . '/abraham/twitteroauth/src'),
+);
diff --git a/twitter/vendor/composer/autoload_real.php b/twitter/vendor/composer/autoload_real.php
new file mode 100644 (file)
index 0000000..f1480a8
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+
+// autoload_real.php @generated by Composer
+
+class ComposerAutoloaderInitd051a3fd38373f38066f9a7f62be4c25
+{
+    private static $loader;
+
+    public static function loadClassLoader($class)
+    {
+        if ('Composer\Autoload\ClassLoader' === $class) {
+            require __DIR__ . '/ClassLoader.php';
+        }
+    }
+
+    public static function getLoader()
+    {
+        if (null !== self::$loader) {
+            return self::$loader;
+        }
+
+        spl_autoload_register(array('ComposerAutoloaderInitd051a3fd38373f38066f9a7f62be4c25', 'loadClassLoader'), true, true);
+        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
+        spl_autoload_unregister(array('ComposerAutoloaderInitd051a3fd38373f38066f9a7f62be4c25', 'loadClassLoader'));
+
+        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
+        if ($useStaticLoader) {
+            require_once __DIR__ . '/autoload_static.php';
+
+            call_user_func(\Composer\Autoload\ComposerStaticInitd051a3fd38373f38066f9a7f62be4c25::getInitializer($loader));
+        } else {
+            $map = require __DIR__ . '/autoload_namespaces.php';
+            foreach ($map as $namespace => $path) {
+                $loader->set($namespace, $path);
+            }
+
+            $map = require __DIR__ . '/autoload_psr4.php';
+            foreach ($map as $namespace => $path) {
+                $loader->setPsr4($namespace, $path);
+            }
+
+            $classMap = require __DIR__ . '/autoload_classmap.php';
+            if ($classMap) {
+                $loader->addClassMap($classMap);
+            }
+        }
+
+        $loader->register(true);
+
+        return $loader;
+    }
+}
diff --git a/twitter/vendor/composer/autoload_static.php b/twitter/vendor/composer/autoload_static.php
new file mode 100644 (file)
index 0000000..a02e4d6
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+// autoload_static.php @generated by Composer
+
+namespace Composer\Autoload;
+
+class ComposerStaticInitd051a3fd38373f38066f9a7f62be4c25
+{
+    public static $prefixLengthsPsr4 = array (
+        'A' => 
+        array (
+            'Abraham\\TwitterOAuth\\' => 21,
+        ),
+    );
+
+    public static $prefixDirsPsr4 = array (
+        'Abraham\\TwitterOAuth\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/abraham/twitteroauth/src',
+        ),
+    );
+
+    public static function getInitializer(ClassLoader $loader)
+    {
+        return \Closure::bind(function () use ($loader) {
+            $loader->prefixLengthsPsr4 = ComposerStaticInitd051a3fd38373f38066f9a7f62be4c25::$prefixLengthsPsr4;
+            $loader->prefixDirsPsr4 = ComposerStaticInitd051a3fd38373f38066f9a7f62be4c25::$prefixDirsPsr4;
+
+        }, null, ClassLoader::class);
+    }
+}
diff --git a/twitter/vendor/composer/installed.json b/twitter/vendor/composer/installed.json
new file mode 100644 (file)
index 0000000..3ee3d3d
--- /dev/null
@@ -0,0 +1,58 @@
+[
+    {
+        "name": "abraham/twitteroauth",
+        "version": "0.7.4",
+        "version_normalized": "0.7.4.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/abraham/twitteroauth.git",
+            "reference": "c6f9e692552dd037b2324ed0dfa28a4e60875acf"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/abraham/twitteroauth/zipball/c6f9e692552dd037b2324ed0dfa28a4e60875acf",
+            "reference": "c6f9e692552dd037b2324ed0dfa28a4e60875acf",
+            "shasum": ""
+        },
+        "require": {
+            "ext-curl": "*",
+            "php": "^5.6 || ^7.0"
+        },
+        "require-dev": {
+            "phpmd/phpmd": "~2.6",
+            "phpunit/phpunit": "~5.7",
+            "squizlabs/php_codesniffer": "~3.0"
+        },
+        "time": "2017-06-30T22:02:01+00:00",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Abraham\\TwitterOAuth\\": "src"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Abraham Williams",
+                "email": "abraham@abrah.am",
+                "homepage": "https://abrah.am",
+                "role": "Developer"
+            }
+        ],
+        "description": "The most popular PHP library for use with the Twitter OAuth REST API.",
+        "homepage": "https://twitteroauth.com",
+        "keywords": [
+            "Twitter API",
+            "Twitter oAuth",
+            "api",
+            "oauth",
+            "rest",
+            "social",
+            "twitter"
+        ]
+    }
+]
index 583f6c974e75f559a098398150880d501a279077..faa553cc18cd2d31587cf280c48fac65523ead39 100644 (file)
@@ -5,15 +5,15 @@
  * Version: 1.0
  * Author: Michael Vogel <http://pirati.ca/profile/heluecht>
  */
-
-require_once 'include/Smilies.php';
+use Friendica\Core\Addon;
+use Friendica\Content\Smilies;
 
 function unicode_smilies_install() {
-       register_hook('smilie', 'addon/unicode_smilies/unicode_smilies.php', 'unicode_smilies_smilies');
+       Addon::registerHook('smilie', 'addon/unicode_smilies/unicode_smilies.php', 'unicode_smilies_smilies');
 }
 
 function unicode_smilies_uninstall() {
-       unregister_hook('smilie', 'addon/unicode_smilies/unicode_smilies.php', 'unicode_smilies_smilies');
+       Addon::unregisterHook('smilie', 'addon/unicode_smilies/unicode_smilies.php', 'unicode_smilies_smilies');
 }
 
 function unicode_smilies_smilies(&$a,&$b) {
diff --git a/viewsrc/lang/it/messages.po b/viewsrc/lang/it/messages.po
new file mode 100644 (file)
index 0000000..0b9f3f9
--- /dev/null
@@ -0,0 +1,23 @@
+# ADDON viewsrc
+# Copyright (C)
+# This file is distributed under the same license as the Friendica viewsrc addon package.
+# 
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-02-27 05:01-0500\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: fabrixxm <fabrix.xm@gmail.com>, 2018\n"
+"Language-Team: Italian (https://www.transifex.com/Friendica/teams/12172/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: viewsrc.php:39
+msgid "View Source"
+msgstr "Vedi Sorgente"
index a567e3f6dad82c1f54880ac2e3821a2f57103fb2..09b93909e7a62b2ab189f748439835f37b27ea61 100644 (file)
@@ -1,3 +1,8 @@
-<?php\r
-\r
-$a->strings["View Source"] = "Vedi sorgente";\r
+<?php
+
+if(! function_exists("string_plural_select_it")) {
+function string_plural_select_it($n){
+       return ($n != 1);;
+}}
+;
+$a->strings["View Source"] = "Vedi Sorgente";
index 687d925372a0000b955556ea3777079cfac8dd8c..d3d9876b44742d8eafbda47b3992d777643d968b 100644 (file)
@@ -1,6 +1,4 @@
 <?php
-
-
 /**
  * Name: viewsrc
  * Description: Add "View Source" link to item context
@@ -8,16 +6,18 @@
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
  * 
  */
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
 
 function viewsrc_install() {
-       register_hook('item_photo_menu', 'addon/viewsrc/viewsrc.php', 'viewsrc_item_photo_menu');
-       register_hook('page_end', 'addon/viewsrc/viewsrc.php', 'viewsrc_page_end');
+       Addon::registerHook('item_photo_menu', 'addon/viewsrc/viewsrc.php', 'viewsrc_item_photo_menu');
+       Addon::registerHook('page_end', 'addon/viewsrc/viewsrc.php', 'viewsrc_page_end');
 }
 
 
 function viewsrc_uninstall() {
-       unregister_hook('item_photo_menu', 'addon/viewsrc/viewsrc.php', 'viewsrc_item_photo_menu');
-       unregister_hook('page_end', 'addon/viewsrc/viewsrc.php', 'viewsrc_page_end');
+       Addon::unregisterHook('item_photo_menu', 'addon/viewsrc/viewsrc.php', 'viewsrc_item_photo_menu');
+       Addon::unregisterHook('page_end', 'addon/viewsrc/viewsrc.php', 'viewsrc_page_end');
 
 }
 
@@ -33,27 +33,29 @@ function viewsrc_page_end(&$a, &$o){
 EOS;
 }
 
-function viewsrc_item_photo_menu(&$a,&$b) {
-       if(!local_user())
+function viewsrc_item_photo_menu(&$a, &$b)
+{
+       if (!local_user()) {
                return;
+       }
 
        if (local_user() != $b['item']['uid']) {
                $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s'",
                                intval(local_user()), dbesc($b['item']['guid']));
 
-               if (!$r)
+               if (!$r) {
                        return;
+               }
 
                $item_id = $r[0]['id'];
-
-       } else
+       } else {
                $item_id = $b['item']['id'];
+       }
 
-       $b['menu'] = array_merge( array( t('View Source') => $a->get_baseurl() . '/viewsrc/'. $item_id), $b['menu']);
+       $b['menu'] = array_merge([L10n::t('View Source') => $a->get_baseurl() . '/viewsrc/'. $item_id], $b['menu']);
 
        //if((! local_user()) || (local_user() != $b['item']['uid']))
        //      return;
 
-       //$b['menu'] = array_merge( array( t('View Source') => $a->get_baseurl() . '/viewsrc/'. $b['item']['id']), $b['menu']);
-
+       //$b['menu'] = array_merge(array(L10n::t('View Source') => $a->get_baseurl() . '/viewsrc/'. $b['item']['id']), $b['menu']);
 }
index 4f6c55cacfe5cad76e16fbee83d7f22e89ba0d2f..2b5c9ed00704de33e514c42e782187ac203cba42 100644 (file)
@@ -1,8 +1,8 @@
-WebRTC Plugin
+WebRTC Addon
 =============
 
 This is a quick and dirty addon to add a [webrtc][1] website as an app. As webrtc
-advances so rapidly there is s a chance this plugin will be obsolete. Webrtc is
+advances so rapidly there is s a chance this addon will be obsolete. Webrtc is
 a new video and audio conferencing tool that is browser to browser
 communication, no need to download specific software for just conferencing.
 There are many different webrtc instances and because of the technology it is
@@ -10,7 +10,7 @@ really a person 2 person communication, using the server to only signal who
 wants to talk to who, the actual transfer of the audio and video is directly
 between the participants.
 
-If you would like to try this plugin please download one of the following
+If you would like to try this addon please download one of the following
 either Chrome/Chromium 25 or higher or Firefox 21 or higher. Then test it by
 visiting a known webrtc instance (i.e. [live.mayfirst.org](https://live.mayfirst.org)) create a
 room, you should be asked to share your camera and microphone (firefox will let
index ae800a32d7e7e2bc33c21b49f7ad5a785e4daf2a..9410d594dc837081608f1547d3cbdaa0894876d4 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-06-23 14:45+0200\n"
-"PO-Revision-Date: 2014-09-10 14:50+0000\n"
+"PO-Revision-Date: 2017-09-20 06:09+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
index 8b3a243e32e49174dca797c13d0ca843b31d4df6..cdf7fd2a4df055063cfe682c2b9b529bf7c209fa 100644 (file)
@@ -6,31 +6,34 @@
  * Author: Stephen Mahood <https://friends.mayfirst.org/profile/marxistvegan>
  * Author: Tobias Diekershoff <https://f.diekershoff.de/profile/tobias>
  */
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
 
 function webrtc_install() {
-        register_hook('app_menu', 'addon/webrtc/webrtc.php', 'webrtc_app_menu');
+        Addon::registerHook('app_menu', 'addon/webrtc/webrtc.php', 'webrtc_app_menu');
 }
 
 function webrtc_uninstall() {
-        unregister_hook('app_menu', 'addon/webrtc/webrtc.php', 'webrtc_app_menu');
+        Addon::unregisterHook('app_menu', 'addon/webrtc/webrtc.php', 'webrtc_app_menu');
 
 }
 
 function webrtc_app_menu($a,&$b) {
-       $b['app_menu'][] = '<div class="app-title"><a href="webrtc">' . t('WebRTC Videochat') . '</a></div>';
+       $b['app_menu'][] = '<div class="app-title"><a href="webrtc">' . L10n::t('WebRTC Videochat') . '</a></div>';
 }
 
-function webrtc_plugin_admin (&$a, &$o) {
+function webrtc_addon_admin (&$a, &$o) {
         $t = get_markup_template( "admin.tpl", "addon/webrtc/" );
-       $o = replace_macros( $t, array(
-           '$submit' => t('Save Settings'),
-           '$webrtcurl' => array('webrtcurl', t('WebRTC Base URL'), get_config('webrtc','webrtcurl' ), t('Page your users will create a WebRTC chat room on. For example you could use https://live.mayfirst.org .')),
-       ));
+       $o = replace_macros( $t, [
+           '$submit' => L10n::t('Save Settings'),
+           '$webrtcurl' => ['webrtcurl', L10n::t('WebRTC Base URL'), Config::get('webrtc','webrtcurl' ), L10n::t('Page your users will create a WebRTC chat room on. For example you could use https://live.mayfirst.org .')],
+       ]);
 }
-function webrtc_plugin_admin_post (&$a) {
+function webrtc_addon_admin_post (&$a) {
         $url = ((x($_POST, 'webrtcurl')) ? notags(trim($_POST['webrtcurl'])) : '');
-           set_config('webrtc', 'webrtcurl', $url);
-           info( t('Settings updated.'). EOL);
+           Config::set('webrtc', 'webrtcurl', $url);
+           info(L10n::t('Settings updated.'). EOL);
 }
 
 function webrtc_module() {
@@ -44,10 +47,10 @@ function webrtc_content(&$a) {
         $webrtcurl = get_config('webrtc','webrtcurl');
 
         /* embedd the landing page in an iframe */
-        $o .= '<h2>'.t('Video Chat').'</h2>';
-        $o .= '<p>'.t('WebRTC is a video and audio conferencing tool that works with Firefox (version 21 and above) and Chrome/Chromium (version 25 and above). Just create a new chat room and send the link to someone you want to chat with.').'</p>';
+        $o .= '<h2>'.L10n::t('Video Chat').'</h2>';
+        $o .= '<p>'.L10n::t('WebRTC is a video and audio conferencing tool that works with Firefox (version 21 and above) and Chrome/Chromium (version 25 and above). Just create a new chat room and send the link to someone you want to chat with.').'</p>';
        if ($webrtcurl == '') {
-           $o .= '<p>'.t('Please contact your friendica admin and send a reminder to configure the WebRTC addon.').'</p>';
+           $o .= '<p>'.L10n::t('Please contact your friendica admin and send a reminder to configure the WebRTC addon.').'</p>';
        } else {
            $o .= '<iframe src="'.$webrtcurl.'" width="600px" height="600px"></iframe>';
        }
index c903d2bf85cc4c47c6269e83d36c4b088d85a8c5..79a7a40282286cc2cab35116d24d4c74c0269ec6 100644 (file)
@@ -49,7 +49,7 @@ msgid "Widgets available"
 msgstr ""
 
 #: widgets.php:124
-msgid "Plugin Settings"
+msgid "Addon Settings"
 msgstr ""
 
 #: widget_friendheader.php:40
index db19a10b80497b1eca22de76f979357f363598fa..fb4bd47215ff7deff886494f58d8b7a5cde222c2 100644 (file)
@@ -6,5 +6,5 @@ $a->strings["Connect on Friendica!"] = "Connectar en Friendica";
 $a->strings["Generate new key"] = "Generar nova clau";\r
 $a->strings["Widgets key"] = "Ginys clau";\r
 $a->strings["Widgets available"] = "Ginys disponibles";\r
-$a->strings["Plugin Settings"] = "Ajustos de Plugin";\r
+$a->strings["Addon Settings"] = "Ajustos de Addon";\r
 $a->strings["Get added to this list!"] = "S'afegeixen a aquesta llista!";\r
index 68c4f81fa4f37d9ff2aa0dda69d4a75c6eaf8e6a..e6da406d74fa11b201623191a90132773d6d081c 100644 (file)
@@ -6,5 +6,5 @@ $a->strings["Connect on Friendica!"] = "Připojit na Friendica!";
 $a->strings["Generate new key"] = "Generovat nové klíče";\r
 $a->strings["Widgets key"] = "Widgety klíč";\r
 $a->strings["Widgets available"] = "Widgety k dispozici";\r
-$a->strings["Plugin Settings"] = "Nastavení doplňku";\r
+$a->strings["Addon Settings"] = "Nastavení doplňku";\r
 $a->strings["Get added to this list!"] = "Nechte se přidat do tohoto listu!";\r
index 3137f02dbfc11fb2cb31da0e93597be2d32dfb93..86e42c688511e8acc16dca13b6aac51944f0f04f 100644 (file)
@@ -6,5 +6,5 @@ $a->strings["Connect on Friendica!"] = "In Friendica verbinden!";
 $a->strings["Generate new key"] = "Neuen Schlüssel erstellen";\r
 $a->strings["Widgets key"] = "Widgets Schlüssel";\r
 $a->strings["Widgets available"] = "Verfügbare Widgets";\r
-$a->strings["Plugin Settings"] = "Plugin-Einstellungen";\r
+$a->strings["Addon Settings"] = "Addon-Einstellungen";\r
 $a->strings["Get added to this list!"] = "Werde Mitglied dieser Liste";\r
index 5a599474c9c142d8b7ee8716db156936008f2427..7585a6bb4edc7fc839d5430731b661440802153a 100644 (file)
@@ -6,5 +6,5 @@ $a->strings["Connect on Friendica!"] = "Konekti ĉe Friendica!";
 $a->strings["Generate new key"] = "Generi novan ĉifroŝlosilon";\r
 $a->strings["Widgets key"] = "Ŝlosilo por fenestraĵoj";\r
 $a->strings["Widgets available"] = "Disponeblaj fenestraĵoj";\r
-$a->strings["Plugin Settings"] = "Kromprogramoagordoj";\r
+$a->strings["Addon Settings"] = "Kromprogramoagordoj";\r
 $a->strings["Get added to this list!"] = "Iĝu membro de ĉi tiu listo!";\r
index 181ae8e0275cc1cb4330a641b38010a7160b2118..736ae769ad1d73cfad1049f3d99793e1eab13dca 100644 (file)
@@ -6,5 +6,5 @@ $a->strings["Connect on Friendica!"] = "¡Conéctate en Friendica!";
 $a->strings["Generate new key"] = "Generar clave nueva";\r
 $a->strings["Widgets key"] = "Clave de aplicaciones";\r
 $a->strings["Widgets available"] = "Aplicaciones disponibles";\r
-$a->strings["Plugin Settings"] = "Configuración de los módulos";\r
+$a->strings["Addon Settings"] = "Configuración de los módulos";\r
 $a->strings["Get added to this list!"] = "¡Añadido a la lista!";\r
index b3b6108df696579c65e83922192115fd2b2620ba..2a3000e329b2549ede1a49283a82a092a17c2862 100644 (file)
@@ -6,5 +6,5 @@ $a->strings["Connect on Friendica!"] = "Se connecter sur Friendica!";
 $a->strings["Generate new key"] = "Générer une nouvelle clé";\r
 $a->strings["Widgets key"] = "Clé des widgets";\r
 $a->strings["Widgets available"] = "Widgets disponibles";\r
-$a->strings["Plugin Settings"] = "Extensions";\r
+$a->strings["Addon Settings"] = "Extensions";\r
 $a->strings["Get added to this list!"] = "Ajoutez-vous à cette liste!";\r
index 9892b5f4d2ff6ce09638e8830a682d4323822203..7867762d2ce5028cec34d8b175c1f9fc0e74d5d4 100644 (file)
@@ -6,5 +6,5 @@ $a->strings["Connect on Friendica!"] = "Tengist á Friendica!";
 $a->strings["Generate new key"] = "Búa til nýjan lykil";\r
 $a->strings["Widgets key"] = "Lykill smáforrits ";\r
 $a->strings["Widgets available"] = "Smáforrit til";\r
-$a->strings["Plugin Settings"] = "Eininga stillingar";\r
+$a->strings["Addon Settings"] = "Eininga stillingar";\r
 $a->strings["Get added to this list!"] = "Láta bæta þér við þennan lista!";\r
index d713d8ce02a8b472328c27356edeac8ec878a738..277f1f8653ffa1f28a39e185ccf31eb07a34a63d 100644 (file)
@@ -6,5 +6,5 @@ $a->strings["Connect on Friendica!"] = "Connettiti su Friendica!";
 $a->strings["Generate new key"] = "Genera una nuova chiave";\r
 $a->strings["Widgets key"] = "Chiave Widget";\r
 $a->strings["Widgets available"] = "Widget disponibili";\r
-$a->strings["Plugin Settings"] = "Impostazioni plugin";\r
+$a->strings["Addon Settings"] = "Impostazioni addon";\r
 $a->strings["Get added to this list!"] = "Aggiungiti a questa lista!";\r
index 7774c639b330c23b9b5eb030f8ad485eaaab640c..cdcf3f4333eebc743afd07130c6ef8985a0b8e29 100644 (file)
@@ -6,5 +6,5 @@ $a->strings["Connect on Friendica!"] = "";
 $a->strings["Generate new key"] = "Lag ny nøkkel";\r
 $a->strings["Widgets key"] = "Nøkkel til småprogrammer";\r
 $a->strings["Widgets available"] = "Småprogrammer er tilgjengelige";\r
-$a->strings["Plugin Settings"] = "Tilleggsinnstillinger";\r
+$a->strings["Addon Settings"] = "Tilleggsinnstillinger";\r
 $a->strings["Get added to this list!"] = "";\r
index 967b998be6540687068018d413a0e48a40286542..b36b2cf5f1f7345203873f69bbf7ed31b19233d2 100644 (file)
@@ -6,5 +6,5 @@ $a->strings["Connect on Friendica!"] = "Połączono z Friendica!";
 $a->strings["Generate new key"] = "Stwórz nowy klucz";\r
 $a->strings["Widgets key"] = "";\r
 $a->strings["Widgets available"] = "Widgety są dostępne";\r
-$a->strings["Plugin Settings"] = "Ustawienia wtyczki";\r
+$a->strings["Addon Settings"] = "Ustawienia wtyczki";\r
 $a->strings["Get added to this list!"] = "Zostań dodany do listy!";\r
index 965c39eb3493a9251cc2e1a59258a37ddae9b495..934ffea31c6db450ba6ee1eb7cae54c955248324 100644 (file)
@@ -6,5 +6,5 @@ $a->strings["Connect on Friendica!"] = "Conecte no Friendica!";
 $a->strings["Generate new key"] = "Gerar nova chave";\r
 $a->strings["Widgets key"] = "Chave de widgets";\r
 $a->strings["Widgets available"] = "Widgets disponíveis";\r
-$a->strings["Plugin Settings"] = "Configurações do plugin";\r
+$a->strings["Addon Settings"] = "Configurações do addon";\r
 $a->strings["Get added to this list!"] = "";\r
index 3c455eb3b57dd74f8dcdb8bdcd5a9ca3d1fa11ee..8d8cf250fe01f51765296d70940a2b1a6a19abc5 100644 (file)
@@ -6,5 +6,5 @@ $a->strings["Connect on Friendica!"] = "Подключены к Friendica!";
 $a->strings["Generate new key"] = "Сгенерировать новый ключ";\r
 $a->strings["Widgets key"] = "Ключ виджетов";\r
 $a->strings["Widgets available"] = "Виджеты доступны";\r
-$a->strings["Plugin Settings"] = "Настройки плагина";\r
+$a->strings["Addon Settings"] = "Настройки плагина";\r
 $a->strings["Get added to this list!"] = "";\r
index 0d27628b67561d306160807e315b8d3b7d5dd0dd..6b34aac18d12a72b0fa39857bf6c74abdd9969a3 100644 (file)
@@ -1,3 +1,3 @@
 <?php\r
 \r
-$a->strings["Plugin Settings"] = "Inst&auml;llningar f&ouml;r insticksprogram";\r
+$a->strings["Addon Settings"] = "Inst&auml;llningar f&ouml;r insticksprogram";\r
index 11f1a96e1757349d28d8ab120317be2325fae1e2..df8fc4943fc712e8fad6436ad5fd2e522407797e 100644 (file)
@@ -6,5 +6,5 @@ $a->strings["Connect on Friendica!"] = "连接在Friendica!";
 $a->strings["Generate new key"] = "造成新钥匙";\r
 $a->strings["Widgets key"] = "小窗口钥匙";\r
 $a->strings["Widgets available"] = "可用的小窗口";\r
-$a->strings["Plugin Settings"] = "插件设置";\r
+$a->strings["Addon Settings"] = "插件设置";\r
 $a->strings["Get added to this list!"] = "被在这个单子加入!";\r
index 20a84e253e8ca3a47278b595c03684e409694803..cd3083c489c914d5c3aa4db59713e973d04fc791 100644 (file)
@@ -1,29 +1,38 @@
 <?php
 
-function friendheader_widget_name() {
+use Friendica\Core\L10n;
+
+function friendheader_widget_name()
+{
        return "Shows friends as a bar";
 }
-function friendheader_widget_help() {
+function friendheader_widget_help()
+{
        return "";
 }
 
-function friendheader_widget_args(){
-       return Array();
+function friendheader_widget_args()
+{
+       return [];
 }
 
-function friendheader_widget_size(){
-       return Array('780px','140px');
+function friendheader_widget_size()
+{
+       return ['780px','140px'];
 }
 
 
-function friendheader_widget_content(&$a, $conf){
-
-       $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `user`.* FROM `profile` 
+function friendheader_widget_content(&$a, $conf)
+{
+       $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `user`.* FROM `profile`
                        LEFT JOIN `user` ON `profile`.`uid` = `user`.`uid`
                        WHERE `user`.`uid` = %s AND `profile`.`is-default` = 1 LIMIT 1",
-                       intval($conf['uid'])
+               intval($conf['uid'])
        );
-       if(!count($r)) return;
+       if (!count($r)) {
+               return;
+       }
+
        $a->profile = $r[0];
 
        $o = "";
@@ -37,7 +46,7 @@ function friendheader_widget_content(&$a, $conf){
                
        </style>";
        $o .= _abs_url(contact_block());
-       $o .= "<a href='".$a->get_baseurl().'/profile/'.$a->profile['nickname']."' target=new>". t('Get added to this list!') ."</a>";
-       
+       $o .= "<a href='".$a->get_baseurl().'/profile/'.$a->profile['nickname']."' target=new>". L10n::t('Get added to this list!') ."</a>";
+
        return $o;
 }
index 195667e89bb4962612950534e150f8a78ee567e8..0d218b13604e48fc8fe69141594c5fc67c52fb96 100644 (file)
@@ -1,29 +1,40 @@
 <?php
 
-function friends_widget_name() {
+use Friendica\Core\L10n;
+
+function friends_widget_name()
+{
        return "Shows profile contacts";
 }
-function friends_widget_help() {
+
+function friends_widget_help()
+{
        return "";
 }
 
-function friends_widget_args(){
-       return Array();
+function friends_widget_args()
+{
+       return [];
 }
 
-function friends_widget_size(){
-       return Array('100%','200px');
+function friends_widget_size()
+{
+       return ['100%', '200px'];
 }
 
 
-function friends_widget_content(&$a, $conf){
-
-       $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `user`.* FROM `profile` 
+function friends_widget_content(&$a, $conf)
+{
+       $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `user`.* FROM `profile`
                        LEFT JOIN `user` ON `profile`.`uid` = `user`.`uid`
                        WHERE `user`.`uid` = %s AND `profile`.`is-default` = 1 LIMIT 1",
-                       intval($conf['uid'])
+               intval($conf['uid'])
        );
-       if(!count($r)) return;
+
+       if (!count($r)) {
+               return;
+       }
+       
        $a->profile = $r[0];
 
        $o = "";
@@ -37,6 +48,6 @@ function friends_widget_content(&$a, $conf){
                
        </style>";
        $o .= _abs_url(contact_block());
-       $o .= "<a href='".$a->get_baseurl().'/profile/'.$a->profile['nickname']."'>". t('Connect on Friendica!') ."</a>";
+       $o .= "<a href='".$a->get_baseurl().'/profile/'.$a->profile['nickname']."'>". L10n::t('Connect on Friendica!') ."</a>";
        return $o;
 }
index 8f356da976b856b9326a3ceb217be18086314802..27b5fbe6681928bd15bbb4c6a0f44dd836d2c7d0 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Friendica\Core\L10n;
+
 function like_widget_name() {
        return "Shows likes";
 }
@@ -56,11 +58,11 @@ function like_widget_content(&$a, $conf){
        $t = get_markup_template("widget_like.tpl", "addon/widgets/");
        $o .= replace_macros($t, array(
                '$like'         => $likes,
-               '$strlike'      => sprintf( tt("%d person likes this", "%d people like this", $likes), $likes),
-               
+               '$strlike'      => L10n::tt("%d person likes this", "%d people like this", $likes),
+
                '$dislike'      => $dislikes,
-               '$strdislike'=> sprintf( tt("%d person doesn't like this", "%d people don't like this", $dislikes), $dislikes),
-               
+               '$strdislike'=> L10n::tt("%d person doesn't like this", "%d people don't like this", $dislikes),
+
                '$baseurl' => $a->get_baseurl(),
        ));
                
index 72534ce3bb75863556051ffbbbe91c13738eacc0..76fc14b48b4270a49d4623c1b95c04d62509ffed 100644 (file)
@@ -5,16 +5,18 @@
  * Version: 1.0
  * Author: Fabio Comuni <http://kirgroup.com/profile/fabrix/>
  */
-        
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+
 function widgets_install() {
-       register_hook('plugin_settings', 'addon/widgets/widgets.php', 'widgets_settings'); 
-       register_hook('plugin_settings_post', 'addon/widgets/widgets.php', 'widgets_settings_post');
+       Addon::registerHook('addon_settings', 'addon/widgets/widgets.php', 'widgets_settings');
+       Addon::registerHook('addon_settings_post', 'addon/widgets/widgets.php', 'widgets_settings_post');
        logger("installed widgets");
 }
 function widgets_uninstall() {
-       unregister_hook('plugin_settings', 'addon/widgets/widgets.php', 'widgets_settings'); 
-       unregister_hook('plugin_settings_post', 'addon/widgets/widgets.php', 'widgets_settings_post');
+       Addon::unregisterHook('addon_settings', 'addon/widgets/widgets.php', 'widgets_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/widgets/widgets.php', 'widgets_settings_post');
 }
 
 
@@ -53,13 +55,13 @@ function widgets_settings(&$a,&$o) {
        
 #      $t = file_get_contents( dirname(__file__). "/settings.tpl" );
        $t = get_markup_template("settings.tpl", "addon/widgets/");
-       $o .= replace_macros($t, array(
-               '$submit' => t('Generate new key'),
+       $o .= replace_macros($t, [
+               '$submit' => L10n::t('Generate new key'),
                '$baseurl' => $a->get_baseurl(),
                '$title' => "Widgets",
-               '$label' => t('Widgets key'),
+               '$label' => L10n::t('Widgets key'),
                '$key' => $key,
-               '$widgets_h' => t('Widgets available'),
+               '$widgets_h' => L10n::t('Widgets available'),
                '$widgets' => $widgets,
        ));
        
@@ -121,7 +123,7 @@ function widgets_content(&$a) {
                if (isset($_GET['p']) && local_user()==$conf['uid'] ) {
                        $o .= "<style>.f9k_widget { float: left;border:1px solid black; }</style>";
                        $o .= "<h1>Preview Widget</h1>";
-                       $o .= '<a href="'.$a->get_baseurl().'/settings/addon">'. t("Plugin Settings") .'</a>';
+                       $o .= '<a href="'.$a->get_baseurl().'/settings/addon">'. L10n::t("Addon Settings") .'</a>';
 
                        $o .=  "<h4>".call_user_func($a->argv[1].'_widget_name')."</h4>";
                        $o .=  call_user_func($a->argv[1].'_widget_help');
@@ -165,15 +167,9 @@ function widgets_content(&$a) {
 
                        
                        return $o;
-               }       
-               
-       }       
-       
+               }
+       }
+
        echo $o;
        killme();
 }
-
-
-
-?>
index b6a10a74315ff390660a10c8ecb4f29f58806d49..8643694aae3776005ac0d1c5f7db457fb7221327 100644 (file)
@@ -26,7 +26,7 @@ msgid "WindowsPhonePush Settings"
 msgstr ""
 
 #: windowsphonepush.php:117
-msgid "Enable WindowsPhonePush Plugin"
+msgid "Enable WindowsPhonePush Addon"
 msgstr ""
 
 #: windowsphonepush.php:122
index 672ab3f22914793a76c7f31c53ae9f03b85db5c0..58bf87cff5b4d1e7e561aca94ec7ad0b2c880112 100644 (file)
@@ -28,8 +28,8 @@ msgid "WindowsPhonePush Settings"
 msgstr "WindowsPhonePush Einstellungen"
 
 #: windowsphonepush.php:117
-msgid "Enable WindowsPhonePush Plugin"
-msgstr "Aktiviere WindowsPhonePush Plugin"
+msgid "Enable WindowsPhonePush Addon"
+msgstr "Aktiviere WindowsPhonePush Addon"
 
 #: windowsphonepush.php:122
 msgid "Push text of new item"
index 5dbbafc2f999d0cf7a7ee96dbaf3cbc5b01eefbb..e03a0bd73bc28952fce212591ab0b00aadc1e378 100644 (file)
@@ -7,6 +7,6 @@ function string_plural_select_de($n){
 ;
 $a->strings["WindowsPhonePush settings updated."] = "WindowsPhonePush Einstellungen aktualisiert.";
 $a->strings["WindowsPhonePush Settings"] = "WindowsPhonePush Einstellungen";
-$a->strings["Enable WindowsPhonePush Plugin"] = "Aktiviere WindowsPhonePush Plugin";
+$a->strings["Enable WindowsPhonePush Addon"] = "Aktiviere WindowsPhonePush Addon";
 $a->strings["Push text of new item"] = "Text senden";
 $a->strings["Save Settings"] = "Einstellungen speichern";
index 7d561c218068bd3fe9c01f2df112d2e79c0b34d9..52d8e80765d2c50a66b098b4b0c35852fd617616 100644 (file)
@@ -28,8 +28,8 @@ msgid "WindowsPhonePush Settings"
 msgstr "Ajustes de WindowsPhonePush"
 
 #: windowsphonepush.php:117
-msgid "Enable WindowsPhonePush Plugin"
-msgstr "Habilitar Plugin de WindowsPhonePush"
+msgid "Enable WindowsPhonePush Addon"
+msgstr "Habilitar Addon de WindowsPhonePush"
 
 #: windowsphonepush.php:122
 msgid "Push text of new item"
index 22a5c4c5c238e4754de7a3cd597e2f78de70f6a7..b1a1bd37a70686a4a5331f07766d1eea1e1c3afd 100644 (file)
@@ -7,6 +7,6 @@ function string_plural_select_es($n){
 ;
 $a->strings["WindowsPhonePush settings updated."] = "Ajustes de WindowsPhonePush actualizados.";
 $a->strings["WindowsPhonePush Settings"] = "Ajustes de WindowsPhonePush";
-$a->strings["Enable WindowsPhonePush Plugin"] = "Habilitar Plugin de WindowsPhonePush";
+$a->strings["Enable WindowsPhonePush Addon"] = "Habilitar Addon de WindowsPhonePush";
 $a->strings["Push text of new item"] = "Empujar texto de nuevo objeto";
 $a->strings["Save Settings"] = "Guardar Ajustes";
index 612f4d6cf2d1a589b972ea58ebc217bfa426651f..b1b9a65ce010ccf82c0f5c3513b58cb005ca4715 100644 (file)
@@ -28,7 +28,7 @@ msgid "WindowsPhonePush Settings"
 msgstr "Paramètres WindowsPhonePush"
 
 #: windowsphonepush.php:117
-msgid "Enable WindowsPhonePush Plugin"
+msgid "Enable WindowsPhonePush Addon"
 msgstr "Activer le greffon WindowsPhonePush"
 
 #: windowsphonepush.php:122
index 8edca6fc384410ebe22c2bbd7e0a189bf49f229e..bff0edb39f755dda5535c969eb04ba5136b8e0b2 100644 (file)
@@ -7,6 +7,6 @@ function string_plural_select_fr($n){
 ;
 $a->strings["WindowsPhonePush settings updated."] = "Paramètres WindowsPhonePush mis à jour";
 $a->strings["WindowsPhonePush Settings"] = "Paramètres WindowsPhonePush";
-$a->strings["Enable WindowsPhonePush Plugin"] = "Activer le greffon WindowsPhonePush";
+$a->strings["Enable WindowsPhonePush Addon"] = "Activer le greffon WindowsPhonePush";
 $a->strings["Push text of new item"] = "Pousse le texte du nouvel élément";
 $a->strings["Save Settings"] = "Sauvegarde des paramètres";
index be085107f9f9def69bf42892be7dd4faad2c7a89..39e29279a0abd276ecbea9b6f0dcdce543805380 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014
+# fabrixxm <fabrix.xm@gmail.com>, 2014,2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-10-26 15:02+0100\n"
-"PO-Revision-Date: 2014-10-31 13:46+0000\n"
+"PO-Revision-Date: 2018-03-19 13:26+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -28,8 +28,8 @@ msgid "WindowsPhonePush Settings"
 msgstr "Impostazioni WindowsPhonePush"
 
 #: windowsphonepush.php:117
-msgid "Enable WindowsPhonePush Plugin"
-msgstr "Abilita plugin WindowsPhonePush"
+msgid "Enable WindowsPhonePush Addon"
+msgstr "Abilita componente aggiuntivo WindowsPhonePush"
 
 #: windowsphonepush.php:122
 msgid "Push text of new item"
index a472a7c1363c634db687ba1abb6fad69c42db4be..a45c2c7f5febcedd82e3e2d5f215ec87dd7ea428 100644 (file)
@@ -7,6 +7,6 @@ function string_plural_select_it($n){
 ;
 $a->strings["WindowsPhonePush settings updated."] = "Impostazioni WindowsPhonePush aggiornate.";
 $a->strings["WindowsPhonePush Settings"] = "Impostazioni WindowsPhonePush";
-$a->strings["Enable WindowsPhonePush Plugin"] = "Abilita plugin WindowsPhonePush";
+$a->strings["Enable WindowsPhonePush Addon"] = "Abilita componente aggiuntivo WindowsPhonePush";
 $a->strings["Push text of new item"] = "Notifica il testo dei nuovi elementi";
 $a->strings["Save Settings"] = "Salva Impostazioni";
index 3b55d4a43351102ed76e08e951d690c323ec6668..cbef36dade56530b8e50eed503f12e0c3f775ee8 100644 (file)
@@ -28,8 +28,8 @@ msgid "WindowsPhonePush Settings"
 msgstr "Configurare  WindowsPhonePush"
 
 #: windowsphonepush.php:117
-msgid "Enable WindowsPhonePush Plugin"
-msgstr "Activare Plugin WindowsPhonePush"
+msgid "Enable WindowsPhonePush Addon"
+msgstr "Activare Addon WindowsPhonePush"
 
 #: windowsphonepush.php:122
 msgid "Push text of new item"
index 1c29eaba67efdcf0856c396560e20058e24bcd97..819ef6fe5b6d2217e7e4015ce816104cb257bf43 100644 (file)
@@ -7,6 +7,6 @@ function string_plural_select_ro($n){
 ;
 $a->strings["WindowsPhonePush settings updated."] = "Configurări  WindowsPhonePush actualizate.";
 $a->strings["WindowsPhonePush Settings"] = "Configurare  WindowsPhonePush";
-$a->strings["Enable WindowsPhonePush Plugin"] = "Activare Plugin WindowsPhonePush";
+$a->strings["Enable WindowsPhonePush Addon"] = "Activare Addon WindowsPhonePush";
 $a->strings["Push text of new item"] = "Tastează textul noului element";
 $a->strings["Save Settings"] = "Salvare Configurări";
index 21f986e0ff8d1e7839b7d15a6baa73996566e365..9837e1fe573fbac0f6787d523e611639cfa29ba2 100644 (file)
@@ -9,7 +9,7 @@
  * Pre-requisite: Windows Phone mobile device (at least WP 7.0)
  *                Friendica mobile app on Windows Phone
  *
- * When plugin is installed, the system calls the plugin
+ * When addon is installed, the system calls the addon
  * name_install() function, located in 'addon/name/name.php',
  * where 'name' is the name of the addon.
  * If the addon is removed from the configuration list, the 
  *        count only unseen elements which are not type=activity (likes and dislikes not seen as new elements)
  */
 
-
-function windowsphonepush_install() {
-
-       /**
-        * 
-        * Our plugin will attach in three places.
-        * The first is within cron - so the push notifications will be 
+use Friendica\App;
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Model\User;
+
+function windowsphonepush_install()
+{
+       /* Our addon will attach in three places.
+        * The first is within cron - so the push notifications will be
         * sent every 10 minutes (or whatever is set in crontab).
         *
         */
+       Addon::registerHook('cron', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_cron');
 
-       register_hook('cron', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_cron');
-
-       /**
-        *
-        * Then we'll attach into the plugin settings page, and also the 
+       /* Then we'll attach into the addon settings page, and also the
         * settings post hook so that we can create and update
-        * user preferences. User shall be able to activate the plugin and 
+        * user preferences. User shall be able to activate the addon and
         * define whether he allows pushing first characters of item text
         *
         */
-
-       register_hook('plugin_settings', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_settings');
-       register_hook('plugin_settings_post', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_settings_post');
+       Addon::registerHook('addon_settings', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_settings');
+       Addon::registerHook('addon_settings_post', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_settings_post');
 
        logger("installed windowsphonepush");
 }
@@ -62,10 +62,9 @@ function windowsphonepush_uninstall() {
         * during install. Don't delete data in table `pconfig`.
         *
         */
-
-       unregister_hook('cron', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_cron');
-       unregister_hook('plugin_settings', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_settings');
-       unregister_hook('plugin_settings_post', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_settings_post');
+       Addon::unregisterHook('cron', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_cron');
+       Addon::unregisterHook('addon_settings', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/windowsphonepush/windowsphonepush.php', 'windowsphonepush_settings_post');
 
        logger("removed windowsphonepush");
 }
@@ -95,13 +94,10 @@ function windowsphonepush_settings_post($a,$post) {
 
        set_pconfig(local_user(),'windowsphonepush','senditemtext',intval($_POST['windowsphonepush-senditemtext']));
 
-       info( t('WindowsPhonePush settings updated.') . EOL);
+       info(L10n::t('WindowsPhonePush settings updated.') . EOL);
 }
 
-
-/**
- *
- * Called from the Plugin Setting form. 
+/* Called from the Addon Setting form.
  * Add our own settings info to the page.
  *
  */
@@ -124,20 +120,20 @@ function windowsphonepush_settings(&$a,&$s) {
 
        /* Add some HTML to the existing form */
        $s .= '<div class="settings-block">';
-       $s .= '<h3>' . t('WindowsPhonePush Settings') . '</h3>';
+       $s .= '<h3>' . L10n::t('WindowsPhonePush Settings') . '</h3>';
 
        $s .= '<div id="windowsphonepush-enable-wrapper">';
-       $s .= '<label id="windowsphonepush-enable-label" for="windowsphonepush-enable-chk">' . t('Enable WindowsPhonePush Plugin') . '</label>';
+       $s .= '<label id="windowsphonepush-enable-label" for="windowsphonepush-enable-chk">' . L10n::t('Enable WindowsPhonePush Addon') . '</label>';
        $s .= '<input id="windowsphonepush-enable-chk" type="checkbox" name="windowsphonepush" value="1" ' . $checked_enabled . '/>';
        $s .= '</div><div class="clear"></div>';
 
        $s .= '<div id="windowsphonepush-senditemtext-wrapper">';
-       $s .= '<label id="windowsphonepush-senditemtext-label" for="windowsphonepush-senditemtext-chk">' . t('Push text of new item') . '</label>';
+       $s .= '<label id="windowsphonepush-senditemtext-label" for="windowsphonepush-senditemtext-chk">' . L10n::t('Push text of new item') . '</label>';
        $s .= '<input id="windowsphonepush-senditemtext-chk" type="checkbox" name="windowsphonepush-senditemtext" value="1" ' . $checked_senditemtext . '/>';
        $s .= '</div><div class="clear"></div>';
 
-       /* provide a submit button - enable und senditemtext can be changed by the user*/
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="windowsphonepush-submit" name="windowsphonepush-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div><div class="clear"></div>';
+       /* provide a submit button - enable und senditemtext can be changed by the user */
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="windowsphonepush-submit" name="windowsphonepush-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div><div class="clear"></div>';
 
        /* provide further read-only information concerning the addon (useful for */
        $s .= '<div id="windowsphonepush-device_url-wrapper">';
@@ -149,16 +145,13 @@ function windowsphonepush_settings(&$a,&$s) {
 
 }
 
-
-/**
- *
- * Cron function used to regularly check all users on the server with active windowsphonepushplugin and send
+/* Cron function used to regularly check all users on the server with active windowsphonepushaddon and send
  * notifications to the Microsoft servers and consequently to the Windows Phone device
  *
  */
-
-function windowsphonepush_cron() {
-       // retrieve all UID's for which the plugin windowsphonepush is enabled and loop through every user
+function windowsphonepush_cron()
+{
+       // retrieve all UID's for which the addon windowsphonepush is enabled and loop through every user
        $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'windowsphonepush' AND `k` = 'enable' AND `v` = 1");
        if(count($r)) {
                foreach($r as $rr) {
@@ -168,8 +161,8 @@ function windowsphonepush_cron() {
 
                        // pushing only possible if device_url (the URI on Microsoft server) is available or not "NA" (which will be sent 
                        // by app if user has switched the server setting in app - sending blank not possible as this would return an update error)
-                       if ( ( $device_url == "" ) || ( $device_url == "NA" ) ) {
-                               // no Device-URL for the user availabe, but plugin is enabled --> write info to Logger
+                       if (( $device_url == "" ) || ( $device_url == "NA" )) {
+                               // no Device-URL for the user availabe, but addon is enabled --> write info to Logger
                                logger("WARN: windowsphonepush is enable for user " . $rr['uid'] . ", but no Device-URL is specified for the user.");
                        } else {
                                // retrieve the number of unseen items and the id of the latest one (if there are more than 
@@ -228,10 +221,10 @@ function windowsphonepush_cron() {
                                                $body = $item[0]['body'];
                                                if (substr($body, 0, 4) == "[url") 
                                                        $body = "URL/Image ...";
-                                               else {
-                                                       require_once('include/bbcode.php');
+                                               } else {
                                                        require_once("include/html2plain.php");
-                                                       $body = bbcode($body, false, false, 2, true);
+
+                                                       $body = BBCode::convert($body, false, 2, true);
                                                        $body = html2plain($body, 0);
                                                        $body = ((strlen($body) > 137) ? substr($body, 0, 137) . "..." : $body);
                                                }
@@ -425,9 +418,9 @@ function windowsphonepush_updatesettings(&$a) {
                return "Not Authenticated";
        }
 
-       // no updating if user hasn't enabled the plugin
-       $enable = get_pconfig(local_user(), 'windowsphonepush', 'enable');
-       if(! $enable) {
+       // no updating if user hasn't enabled the addon
+       $enable = PConfig::get(local_user(), 'windowsphonepush', 'enable');
+       if (!$enable) {
                return "Plug-in not enabled";
        }
 
@@ -467,9 +460,9 @@ function windowsphonepush_updatecounterunseen() {
                return "Not Authenticated";
        }
 
-       // no updating if user hasn't enabled the plugin
-       $enable = get_pconfig(local_user(), 'windowsphonepush', 'enable');
-       if(! $enable) {
+       // no updating if user hasn't enabled the addon
+       $enable = PConfig::get(local_user(), 'windowsphonepush', 'enable');
+       if (!$enable) {
                return "Plug-in not enabled";
        }
 
@@ -509,8 +502,9 @@ function windowsphonepush_login() {
            die('This api requires login');
        }
 
-       require_once('include/security.php');
-       authenticate_success($record); $_SESSION["allow_api"] = true;
-       call_hooks('logged_in', $a->user);
+       require_once 'include/security.php';
+       authenticate_success($record);
+       $_SESSION["allow_api"] = true;
+       Addon::callHooks('logged_in', $a->user);
 }
 
index 27baa9606a9390fd671f9af6060a6e5a1d7b9ac5..92bc721d4afae374505d9b7b33f88016b11c874e 100644 (file)
@@ -26,7 +26,7 @@ msgid "Wordpress Export"
 msgstr ""
 
 #: wppost.php:87
-msgid "Enable WordPress Post Plugin"
+msgid "Enable WordPress Post Addon"
 msgstr ""
 
 #: wppost.php:92
index 2856b55c303224dd168d56d4a6b70e4e4b353183..fb8f7d65c72dbb8f34e5de8b02b53cf7a4eac189 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Wordpress"] = "Publica-ho al Wordpress";\r
 $a->strings["WordPress Post Settings"] = "Configuració d'enviaments a WordPress";\r
-$a->strings["Enable WordPress Post Plugin"] = "Habilitar Configuració d'Enviaments a WordPress";\r
+$a->strings["Enable WordPress Post Addon"] = "Habilitar Configuració d'Enviaments a WordPress";\r
 $a->strings["WordPress username"] = "Nom d'usuari de WordPress";\r
 $a->strings["WordPress password"] = "Contrasenya de WordPress";\r
 $a->strings["WordPress API URL"] = "WordPress API URL";\r
index 992a95db2c5c8476625145b675aa4b5f331535d2..d2571365ac5b4e465a4d6ed4b21bc965ba036c3b 100644 (file)
@@ -28,7 +28,7 @@ msgid "Wordpress Export"
 msgstr "Wordpress Export"
 
 #: wppost.php:86
-msgid "Enable WordPress Post Plugin"
+msgid "Enable WordPress Post Addon"
 msgstr "Povolit rozšíření na WordPress"
 
 #: wppost.php:91
index 00352ce7ac10c9e3ee6b933fae842e1c7559d52e..457834224894f3bcb25a2ad0e3e5d59373683bdc 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_cs($n){
 ;
 $a->strings["Post to Wordpress"] = "Příspěvky do WordPress";
 $a->strings["Wordpress Export"] = "Wordpress Export";
-$a->strings["Enable WordPress Post Plugin"] = "Povolit rozšíření na WordPress";
+$a->strings["Enable WordPress Post Addon"] = "Povolit rozšíření na WordPress";
 $a->strings["WordPress username"] = "WordPress uživatelské jméno";
 $a->strings["WordPress password"] = "WordPress heslo";
 $a->strings["WordPress API URL"] = "URL adresa API WordPress";
index 57dde23f2b5ae9e2c6b1c02629d10579b94e1424..eb10db4004d20ac04c56a80f828856186d3b2a5f 100644 (file)
@@ -30,8 +30,8 @@ msgid "Wordpress Export"
 msgstr "Wordpress Export"
 
 #: wppost.php:87
-msgid "Enable WordPress Post Plugin"
-msgstr "WordPress Plugin aktivieren"
+msgid "Enable WordPress Post Addon"
+msgstr "WordPress Addon aktivieren"
 
 #: wppost.php:92
 msgid "WordPress username"
index 9cdc292a99a284c358bd501126a48934be02117c..57ae6afeb45af5fc28a5052b44afdf5abb066f1f 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_de($n){
 ;
 $a->strings["Post to Wordpress"] = "Bei WordPress veröffentlichen";
 $a->strings["Wordpress Export"] = "Wordpress Export";
-$a->strings["Enable WordPress Post Plugin"] = "WordPress Plugin aktivieren";
+$a->strings["Enable WordPress Post Addon"] = "WordPress Addon aktivieren";
 $a->strings["WordPress username"] = "WordPress-Benutzername";
 $a->strings["WordPress password"] = "WordPress-Passwort";
 $a->strings["WordPress API URL"] = "WordPress-API-URL";
index 7c786666d6339f597086a956db5826bc6f4d3c89..04130d7360377b4d1f216e54c820c40cdb0975c5 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Wordpress"] = "Afiŝi al Wordpress";\r
 $a->strings["WordPress Post Settings"] = "Agordoj por WordPress afiŝojn";\r
-$a->strings["Enable WordPress Post Plugin"] = "Ŝalti la Wordpress-afiŝo kromprogramon";\r
+$a->strings["Enable WordPress Post Addon"] = "Ŝalti la Wordpress-afiŝo kromprogramon";\r
 $a->strings["WordPress username"] = "WordPress salutnomo";\r
 $a->strings["WordPress password"] = "WordPress pasvorto";\r
 $a->strings["WordPress API URL"] = "Wordpress API URL adreso";\r
index baac8034bed26bcdfcf8838042405be0b54ecc4e..0c555a7fd667865bbc03c18e3c823678f418ff0d 100644 (file)
@@ -28,8 +28,8 @@ msgid "Wordpress Export"
 msgstr "Exportar a Wordpress"
 
 #: wppost.php:87
-msgid "Enable WordPress Post Plugin"
-msgstr "Habilitar Plugin de publicación de WordPress"
+msgid "Enable WordPress Post Addon"
+msgstr "Habilitar Addon de publicación de WordPress"
 
 #: wppost.php:92
 msgid "WordPress username"
index 1375331180e0d127b4ff4d4bbef21b8a98661fd7..fab68021a876ee9cbcdd5b90c1caebc379f80079 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_es($n){
 ;
 $a->strings["Post to Wordpress"] = "Publicar en Wordpress";
 $a->strings["Wordpress Export"] = "Exportar a Wordpress";
-$a->strings["Enable WordPress Post Plugin"] = "Habilitar Plugin de publicación de WordPress";
+$a->strings["Enable WordPress Post Addon"] = "Habilitar Addon de publicación de WordPress";
 $a->strings["WordPress username"] = "Nombre de usuario de WordPress";
 $a->strings["WordPress password"] = "Contraseña de WordPress";
 $a->strings["WordPress API URL"] = "URL de API de WordPress";
index 9cd4456fe13e784e07332acbd94f653c59ea6a2f..ed5113976fa702aad1067ee5ee6cac2c31b57018 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Wordpress"] = "Poster sur WordPress";\r
 $a->strings["WordPress Post Settings"] = "Réglages WordPress";\r
-$a->strings["Enable WordPress Post Plugin"] = "Activer l'extension WordPress";\r
+$a->strings["Enable WordPress Post Addon"] = "Activer l'extension WordPress";\r
 $a->strings["WordPress username"] = "Utilisateur WordPress";\r
 $a->strings["WordPress password"] = "Mot de passe WordPress";\r
 $a->strings["WordPress API URL"] = "URL de l'API WordPress";\r
index 0b7f3fe7ffe167ce1695a5841d64eb88c512b674..bca63d568c7eb7fed16c821b714f3655dfb352a6 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Wordpress"] = "Senda færslu á Wordpress";\r
 $a->strings["WordPress Post Settings"] = "Wordpress Post stillingar";\r
-$a->strings["Enable WordPress Post Plugin"] = "Kveikja á WordPress Post viðbót";\r
+$a->strings["Enable WordPress Post Addon"] = "Kveikja á WordPress Post viðbót";\r
 $a->strings["WordPress username"] = "Wordpress aðgangsorð";\r
 $a->strings["WordPress password"] = "Wordpress aðgagnsorð";\r
 $a->strings["WordPress API URL"] = "Slóð á Wordpress API";\r
index 2369d955dd5ad52b49936c78f6898e5c1a367c09..85e2b3177c05d7e7d3e273d63e1a8ffaf4a6d9cd 100644 (file)
@@ -4,13 +4,13 @@
 # 
 # 
 # Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2014-2015
+# fabrixxm <fabrix.xm@gmail.com>, 2014-2015,2017-2018
 msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2017-01-24 21:06+0100\n"
-"PO-Revision-Date: 2017-02-10 08:18+0000\n"
+"PO-Revision-Date: 2018-03-19 13:26+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -25,11 +25,11 @@ msgstr "Invia a Wordpress"
 
 #: wppost.php:80 wppost.php:84
 msgid "Wordpress Export"
-msgstr ""
+msgstr "Esporta a Wordpress"
 
 #: wppost.php:87
-msgid "Enable WordPress Post Plugin"
-msgstr "Abilita il plugin di invio a Wordpress"
+msgid "Enable WordPress Post Addon"
+msgstr "Abilita il componente aggiuntivo di invio a Wordpress"
 
 #: wppost.php:92
 msgid "WordPress username"
@@ -55,19 +55,19 @@ msgstr "Inserisci un link al messaggio originale su Friendica"
 msgid ""
 "Text for the backlink, e.g. Read the original post and comment stream on "
 "Friendica."
-msgstr ""
+msgstr "Testo per il backlink, p.e. Leggi il post originale e i commenti su Friendica."
 
 #: wppost.php:121
 msgid "Don't post messages that are too short"
-msgstr ""
+msgstr "Non inviare messaggi troppo corti"
 
 #: wppost.php:127
 msgid "Save Settings"
-msgstr ""
+msgstr "Salva Impostazioni"
 
 #: wppost.php:206
 msgid "Read the orig­i­nal post and com­ment stream on Friendica"
-msgstr ""
+msgstr "Leggi il messaggio originale e i commenti su Friendica"
 
 #: wppost.php:269
 msgid "Post from Friendica"
index 3f616900e88220d4bee4ce80f7f173167a7781b9..c982dbcd272bcd40fa7a414c6b3b18e2e5b4d771 100644 (file)
@@ -6,15 +6,15 @@ function string_plural_select_it($n){
 }}
 ;
 $a->strings["Post to Wordpress"] = "Invia a Wordpress";
-$a->strings["Wordpress Export"] = "";
-$a->strings["Enable WordPress Post Plugin"] = "Abilita il plugin di invio a Wordpress";
+$a->strings["Wordpress Export"] = "Esporta a Wordpress";
+$a->strings["Enable WordPress Post Addon"] = "Abilita il componente aggiuntivo di invio a Wordpress";
 $a->strings["WordPress username"] = "Nome utente Wordpress";
 $a->strings["WordPress password"] = "Password Wordpress";
 $a->strings["WordPress API URL"] = "Indirizzo API Wordpress";
 $a->strings["Post to WordPress by default"] = "Invia sempre a Wordpress";
 $a->strings["Provide a backlink to the Friendica post"] = "Inserisci un link al messaggio originale su Friendica";
-$a->strings["Text for the backlink, e.g. Read the original post and comment stream on Friendica."] = "";
-$a->strings["Don't post messages that are too short"] = "";
-$a->strings["Save Settings"] = "";
-$a->strings["Read the orig­i­nal post and com­ment stream on Friendica"] = "";
+$a->strings["Text for the backlink, e.g. Read the original post and comment stream on Friendica."] = "Testo per il backlink, p.e. Leggi il post originale e i commenti su Friendica.";
+$a->strings["Don't post messages that are too short"] = "Non inviare messaggi troppo corti";
+$a->strings["Save Settings"] = "Salva Impostazioni";
+$a->strings["Read the orig­i­nal post and com­ment stream on Friendica"] = "Leggi il messaggio originale e i commenti su Friendica";
 $a->strings["Post from Friendica"] = "Messaggio da Friendica";
index 5c840e6734b112c2f2ec722e31ca666f2e503595..3d125aa677088ccfe1de7683631a99e9d2ef892c 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Wordpress"] = "";\r
 $a->strings["WordPress Post Settings"] = "";\r
-$a->strings["Enable WordPress Post Plugin"] = "";\r
+$a->strings["Enable WordPress Post Addon"] = "";\r
 $a->strings["WordPress username"] = "";\r
 $a->strings["WordPress password"] = "";\r
 $a->strings["WordPress API URL"] = "";\r
index 201ead1d42b6cb04b0bc3a2347691f4ac7950282..ab2df6a71f274803945a4c55bddd85a87c57553e 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Wordpress"] = "Opublikuj na Wordpress";\r
 $a->strings["WordPress Post Settings"] = "Ustawienia wpisów WorldPress";\r
-$a->strings["Enable WordPress Post Plugin"] = "Włącz plugin wpisów WorldPress";\r
+$a->strings["Enable WordPress Post Addon"] = "Włącz addon wpisów WorldPress";\r
 $a->strings["WordPress username"] = "nazwa użytkownika WordPress";\r
 $a->strings["WordPress password"] = "hasło WordPress";\r
 $a->strings["WordPress API URL"] = "WordPress API URL";\r
index 3d2ad0ffdbc0df69a3493520570554d4958cec53..b011d0c2eaea0e69125fb03dd50cff0421be1ebd 100644 (file)
@@ -28,7 +28,7 @@ msgid "WordPress Post Settings"
 msgstr "Configurações de publicação no WordPress"
 
 #: wppost.php:78
-msgid "Enable WordPress Post Plugin"
+msgid "Enable WordPress Post Addon"
 msgstr "Habilitar plug-in para publicar no WordPress"
 
 #: wppost.php:83
index dbb6eb1f2330e94e2f212d31767024966fdde14f..fc59fcb38b79524c689961043a0282c8afdbf23e 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_pt_br($n){
 ;
 $a->strings["Post to Wordpress"] = "Publicar no Wordpress";
 $a->strings["WordPress Post Settings"] = "Configurações de publicação no WordPress";
-$a->strings["Enable WordPress Post Plugin"] = "Habilitar plug-in para publicar no WordPress";
+$a->strings["Enable WordPress Post Addon"] = "Habilitar plug-in para publicar no WordPress";
 $a->strings["WordPress username"] = "Nome de usuário no WordPress";
 $a->strings["WordPress password"] = "Senha do WordPress";
 $a->strings["WordPress API URL"] = "";
index d329836d12f0053576976451dcf9624e10ab3f0c..a239bcb5809e3c97375c1b53f67b1d14a5371ab4 100644 (file)
@@ -27,7 +27,7 @@ msgid "Wordpress Export"
 msgstr "Export pe Wordpress"
 
 #: wppost.php:86
-msgid "Enable WordPress Post Plugin"
+msgid "Enable WordPress Post Addon"
 msgstr "Activare Modul Postare pe Wordpress"
 
 #: wppost.php:91
index 86835bc3922de1e7022fe3dc3f33caa97222cffc..fcd0efa43b98932d84aa60f7adf101e0f7e37816 100644 (file)
@@ -7,7 +7,7 @@ function string_plural_select_ro($n){
 ;
 $a->strings["Post to Wordpress"] = "Postați pe Wordpress";
 $a->strings["Wordpress Export"] = "Export pe Wordpress";
-$a->strings["Enable WordPress Post Plugin"] = "Activare Modul Postare pe Wordpress";
+$a->strings["Enable WordPress Post Addon"] = "Activare Modul Postare pe Wordpress";
 $a->strings["WordPress username"] = "Utilizator WordPress ";
 $a->strings["WordPress password"] = "Parolă WordPress ";
 $a->strings["WordPress API URL"] = "URL Cheie API WordPress";
index f193addc7fe4522119ef002b2df473d483440421..5eefa6390b0b0c9604dd109276beef209047f470 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Wordpress"] = "Сообщение для Wordpress";\r
 $a->strings["WordPress Post Settings"] = "Настройки сообщений для Wordpress";\r
-$a->strings["Enable WordPress Post Plugin"] = "Включить WordPress  плагин сообщений";\r
+$a->strings["Enable WordPress Post Addon"] = "Включить WordPress  плагин сообщений";\r
 $a->strings["WordPress username"] = "WordPress Имя пользователя";\r
 $a->strings["WordPress password"] = "WordPress паролъ";\r
 $a->strings["WordPress API URL"] = "WordPress API URL";\r
index 74db63063bd1efa6f04d579a923d276c093d10aa..9ac233fd76ad3026d88554832de36d9d3673c51b 100644 (file)
@@ -2,7 +2,7 @@
 \r
 $a->strings["Post to Wordpress"] = "发送到Wordpress";\r
 $a->strings["WordPress Post Settings"] = "Wordpress发送设置";\r
-$a->strings["Enable WordPress Post Plugin"] = "使Wordpress发送插件可用";\r
+$a->strings["Enable WordPress Post Addon"] = "使Wordpress发送插件可用";\r
 $a->strings["WordPress username"] = "Wordpress用户名";\r
 $a->strings["WordPress password"] = "Wordpress密码";\r
 $a->strings["WordPress API URL"] = "WordPress API URL";\r
index fc9244af6ee72193d8b9e0aee060753ff4ebcf2b..96209b1513358afd6468f53fca5fe66fe4c7482e 100644 (file)
@@ -1,31 +1,35 @@
 <?php
-
 /**
  * Name: WordPress Post Connector
  * Description: Post to WordPress (or anything else which uses blogger XMLRPC API)
  * Version: 1.1
  * Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
  */
+use Friendica\Content\Text\BBCode;
+use Friendica\Core\Addon;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+use Friendica\Util\Network;
 
 function wppost_install() {
-    register_hook('post_local',           'addon/wppost/wppost.php', 'wppost_post_local');
-    register_hook('notifier_normal',      'addon/wppost/wppost.php', 'wppost_send');
-    register_hook('jot_networks',         'addon/wppost/wppost.php', 'wppost_jot_nets');
-    register_hook('connector_settings',      'addon/wppost/wppost.php', 'wppost_settings');
-    register_hook('connector_settings_post', 'addon/wppost/wppost.php', 'wppost_settings_post');
+    Addon::registerHook('post_local',           'addon/wppost/wppost.php', 'wppost_post_local');
+    Addon::registerHook('notifier_normal',      'addon/wppost/wppost.php', 'wppost_send');
+    Addon::registerHook('jot_networks',         'addon/wppost/wppost.php', 'wppost_jot_nets');
+    Addon::registerHook('connector_settings',      'addon/wppost/wppost.php', 'wppost_settings');
+    Addon::registerHook('connector_settings_post', 'addon/wppost/wppost.php', 'wppost_settings_post');
 
 }
 function wppost_uninstall() {
-    unregister_hook('post_local',       'addon/wppost/wppost.php', 'wppost_post_local');
-    unregister_hook('notifier_normal',  'addon/wppost/wppost.php', 'wppost_send');
-    unregister_hook('jot_networks',     'addon/wppost/wppost.php', 'wppost_jot_nets');
-    unregister_hook('connector_settings',      'addon/wppost/wppost.php', 'wppost_settings');
-    unregister_hook('connector_settings_post', 'addon/wppost/wppost.php', 'wppost_settings_post');
+    Addon::unregisterHook('post_local',       'addon/wppost/wppost.php', 'wppost_post_local');
+    Addon::unregisterHook('notifier_normal',  'addon/wppost/wppost.php', 'wppost_send');
+    Addon::unregisterHook('jot_networks',     'addon/wppost/wppost.php', 'wppost_jot_nets');
+    Addon::unregisterHook('connector_settings',      'addon/wppost/wppost.php', 'wppost_settings');
+    Addon::unregisterHook('connector_settings_post', 'addon/wppost/wppost.php', 'wppost_settings_post');
 
        // obsolete - remove
-    unregister_hook('post_local_end',   'addon/wppost/wppost.php', 'wppost_send');
-    unregister_hook('plugin_settings',  'addon/wppost/wppost.php', 'wppost_settings');
-    unregister_hook('plugin_settings_post',  'addon/wppost/wppost.php', 'wppost_settings_post');
+    Addon::unregisterHook('post_local_end',   'addon/wppost/wppost.php', 'wppost_send');
+    Addon::unregisterHook('addon_settings',  'addon/wppost/wppost.php', 'wppost_settings');
+    Addon::unregisterHook('addon_settings_post',  'addon/wppost/wppost.php', 'wppost_settings_post');
 
 }
 
@@ -39,7 +43,7 @@ function wppost_jot_nets(&$a,&$b) {
         $wp_defpost = get_pconfig(local_user(),'wppost','post_by_default');
         $selected = ((intval($wp_defpost) == 1) ? ' checked="checked" ' : '');
         $b .= '<div class="profile-jot-net"><input type="checkbox" name="wppost_enable" ' . $selected . ' value="1" /> '
-            . t('Post to Wordpress') . '</div>';
+            . L10n::t('Post to Wordpress') . '</div>';
     }
 }
 
@@ -77,54 +81,54 @@ function wppost_settings(&$a,&$s) {
     /* Add some HTML to the existing form */
 
     $s .= '<span id="settings_wppost_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_wppost_expanded\'); openClose(\'settings_wppost_inflated\');">';
-    $s .= '<img class="connector'.$css.'" src="images/wordpress.png" /><h3 class="connector">'. t('Wordpress Export').'</h3>';
+    $s .= '<img class="connector'.$css.'" src="images/wordpress.png" /><h3 class="connector">'. L10n::t('Wordpress Export').'</h3>';
     $s .= '</span>';
     $s .= '<div id="settings_wppost_expanded" class="settings-block" style="display: none;">';
     $s .= '<span class="fakelink" onclick="openClose(\'settings_wppost_expanded\'); openClose(\'settings_wppost_inflated\');">';
-    $s .= '<img class="connector'.$css.'" src="images/wordpress.png" /><h3 class="connector">'. t('Wordpress Export').'</h3>';
+    $s .= '<img class="connector'.$css.'" src="images/wordpress.png" /><h3 class="connector">'. L10n::t('Wordpress Export').'</h3>';
     $s .= '</span>';
     $s .= '<div id="wppost-enable-wrapper">';
-    $s .= '<label id="wppost-enable-label" for="wppost-checkbox">' . t('Enable WordPress Post Plugin') . '</label>';
+    $s .= '<label id="wppost-enable-label" for="wppost-checkbox">' . L10n::t('Enable WordPress Post Addon') . '</label>';
     $s .= '<input id="wppost-checkbox" type="checkbox" name="wppost" value="1" ' . $checked . '/>';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="wppost-username-wrapper">';
-    $s .= '<label id="wppost-username-label" for="wppost-username">' . t('WordPress username') . '</label>';
+    $s .= '<label id="wppost-username-label" for="wppost-username">' . L10n::t('WordPress username') . '</label>';
     $s .= '<input id="wppost-username" type="text" name="wp_username" value="' . $wp_username . '" />';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="wppost-password-wrapper">';
-    $s .= '<label id="wppost-password-label" for="wppost-password">' . t('WordPress password') . '</label>';
+    $s .= '<label id="wppost-password-label" for="wppost-password">' . L10n::t('WordPress password') . '</label>';
     $s .= '<input id="wppost-password" type="password" name="wp_password" value="' . $wp_password . '" />';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="wppost-blog-wrapper">';
-    $s .= '<label id="wppost-blog-label" for="wppost-blog">' . t('WordPress API URL') . '</label>';
+    $s .= '<label id="wppost-blog-label" for="wppost-blog">' . L10n::t('WordPress API URL') . '</label>';
     $s .= '<input id="wppost-blog" type="text" name="wp_blog" value="' . $wp_blog . '" />';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="wppost-bydefault-wrapper">';
-    $s .= '<label id="wppost-bydefault-label" for="wppost-bydefault">' . t('Post to WordPress by default') . '</label>';
+    $s .= '<label id="wppost-bydefault-label" for="wppost-bydefault">' . L10n::t('Post to WordPress by default') . '</label>';
     $s .= '<input id="wppost-bydefault" type="checkbox" name="wp_bydefault" value="1" ' . $def_checked . '/>';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="wppost-backlink-wrapper">';
-    $s .= '<label id="wppost-backlink-label" for="wppost-backlink">' . t('Provide a backlink to the Friendica post') . '</label>';
+    $s .= '<label id="wppost-backlink-label" for="wppost-backlink">' . L10n::t('Provide a backlink to the Friendica post') . '</label>';
     $s .= '<input id="wppost-backlink" type="checkbox" name="wp_backlink" value="1" ' . $back_checked . '/>';
     $s .= '</div><div class="clear"></div>';
     $s .= '<div id="wppost-backlinktext-wrapper">';
-    $s .= '<label id="wppost-backlinktext-label" for="wp_backlink_text">' . t('Text for the backlink, e.g. Read the original post and comment stream on Friendica.') . '</label>';
+    $s .= '<label id="wppost-backlinktext-label" for="wp_backlink_text">' . L10n::t('Text for the backlink, e.g. Read the original post and comment stream on Friendica.') . '</label>';
     $s .= '<input id="wppost-backlinktext" type="text" name="wp_backlink_text" value="'. $wp_backlink_text.'" ' . $wp_backlink_text . '/>';
     $s .= '</div><div class="clear"></div>';
 
     $s .= '<div id="wppost-shortcheck-wrapper">';
-    $s .= '<label id="wppost-shortcheck-label" for="wppost-shortcheck">' . t("Don't post messages that are too short") . '</label>';
+    $s .= '<label id="wppost-shortcheck-label" for="wppost-shortcheck">' . L10n::t("Don't post messages that are too short") . '</label>';
     $s .= '<input id="wppost-shortcheck" type="checkbox" name="wp_shortcheck" value="1" '.$shortcheck_checked.'/>';
     $s .= '</div><div class="clear"></div>';
 
     /* provide a submit button */
 
-    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="wppost-submit" name="wppost-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+    $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="wppost-submit" name="wppost-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
 }
 
@@ -141,7 +145,7 @@ function wppost_settings_post(&$a,&$b) {
                set_pconfig(local_user(),'wppost','backlink',trim($_POST['wp_backlink']));
                set_pconfig(local_user(),'wppost','shortcheck',trim($_POST['wp_shortcheck']));
                $wp_backlink_text = notags(trim($_POST['wp_backlink_text']));
-               $wp_backlink_text = bbcode($wp_backlink_text, false, false, 8);
+               $wp_backlink_text = BBCode::convert($wp_backlink_text, false, 8);
                $wp_backlink_text = html2plain($wp_backlink_text, 0, true);
                set_pconfig(local_user(),'wppost','wp_backlink_text', $wp_backlink_text);
 
@@ -204,21 +208,18 @@ function wppost_send(&$a,&$b) {
        $wp_blog = get_pconfig($b['uid'],'wppost','wp_blog');
        $wp_backlink_text = get_pconfig($b['uid'],'wppost','wp_backlink_text');
        if ($wp_backlink_text == '') {
-               $wp_backlink_text = t('Read the orig­i­nal post and com­ment stream on Friendica');
+               $wp_backlink_text = L10n::t('Read the orig­i­nal post and com­ment stream on Friendica');
        }
 
-       if($wp_username && $wp_password && $wp_blog) {
-
-               require_once('include/bbcode.php');
-               require_once('include/html2plain.php');
-               require_once('include/plaintext.php');
+       if ($wp_username && $wp_password && $wp_blog) {
+               require_once 'include/html2plain.php';
 
                $wptitle = trim($b['title']);
 
-               if (intval(get_pconfig($b['uid'],'wppost','shortcheck'))) {
+               if (intval(PConfig::get($b['uid'], 'wppost', 'shortcheck'))) {
                        // Checking, if its a post that is worth a blog post
                        $postentry = false;
-                       $siteinfo = get_attached_data($b["body"]);
+                       $siteinfo = BBCode::getAttachedData($b["body"]);
 
                        // Is it a link to an aricle, a video or a photo?
                        if (isset($siteinfo["type"])) {
@@ -245,7 +246,7 @@ function wppost_send(&$a,&$b) {
                // If the title is empty then try to guess
                if ($wptitle == '') {
                        // Fetch information about the post
-                       $siteinfo = get_attached_data($b["body"]);
+                       $siteinfo = BBCode::getAttachedData($b["body"]);
                        if (isset($siteinfo["title"])) {
                                $wptitle = $siteinfo["title"];
                        }
@@ -255,7 +256,7 @@ function wppost_send(&$a,&$b) {
                                // Remove the share element before fetching the first line
                                $title = trim(preg_replace("/\[share.*?\](.*?)\[\/share\]/ism","\n$1\n",$b['body']));
 
-                               $title = html2plain(bbcode($title, false, false), 0, true)."\n";
+                               $title = html2plain(BBCode::convert($title, false), 0, true)."\n";
                                $pos = strpos($title, "\n");
                                $trailer = "";
                                if (($pos == 0) || ($pos > 100)) {
@@ -267,8 +268,8 @@ function wppost_send(&$a,&$b) {
                        }
                }
 
-               $title = '<title>' . (($wptitle) ? $wptitle : t('Post from Friendica')) . '</title>';
-               $post = bbcode($b['body'], false, false, 4);
+               $title = '<title>' . (($wptitle) ? $wptitle : L10n::t('Post from Friendica')) . '</title>';
+               $post = BBCode::convert($b['body'], false, 4);
 
                // If a link goes to youtube then remove the stuff around it. Wordpress detects youtube links and embeds it
                $post = preg_replace('/<a.*?href="(https?:\/\/www.youtube.com\/.*?)".*?>(.*?)<\/a>/ism',"\n$1\n",$post);
@@ -303,10 +304,9 @@ EOT;
 
                logger('wppost: data: ' . $xml, LOGGER_DATA);
 
-               if($wp_blog !== 'test') {
-                       $x = post_url($wp_blog,$xml);
+               if ($wp_blog !== 'test') {
+                       $x = Network::post($wp_blog, $xml);
                }
                logger('posted to wordpress: ' . (($x) ? $x : ''), LOGGER_DEBUG);
-
        }
 }
index f0a5b99136052b5ad910b1451af03cf71484b4dd..96b61a7618e4d7e33b5c7bb4b359a0cbdfe553b6 100644 (file)
@@ -55,7 +55,7 @@ Integration into other frameworks
     `django-conversejs <https://pypi.python.org/pypi/django-conversejs>`_ is an app that makes it easer to integrate *Converse.js* into Django.
     `django-xmpp <https://github.com/fpytloun/django-xmpp>`_ adds XMPP chat integration with converse.js by letting Ejabberd authenticate against your Django site.
 * `Roundcube <http://roundcube.net>`_: 
-    `roundcube-converse.js-xmpp-plugin <https://github.com/priyadi/roundcube-converse.js-xmpp-plugin>`_ is a plugin for Roundcube Webmail.
+    `roundcube-converse.js-xmpp-plugin <https://github.com/priyadi/roundcube-converse.js-xmpp-plugin>`_ is an addon for Roundcube Webmail.
 * `Wordpress <http://wordpress.org>`_:
     `ConverseJS <http://wordpress.org/plugins/conversejs>`_
 * `Patternslib <http://patternslib.com>`_:
index 7efcf9609d074564c3c5bbb70f2f893ef7617184..7ac83109ca24a7dee0818b2f22c400ed53627ec5 100644 (file)
@@ -2,8 +2,8 @@
  * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
  * Available via the MIT or new BSD license.
  * see: http://github.com/jrburke/almond for details
- */\r
-\r
+ */
+
 /*!
  * jQuery JavaScript Library v1.11.0
  * http://jquery.com/
@@ -16,8 +16,8 @@
  * http://jquery.org/license
  *
  * Date: 2014-01-23T21:02Z
- */\r
-\r
+ */
+
 /*!
  * Sizzle CSS Selector Engine v1.10.16
  * http://sizzlejs.com/
  * http://jquery.org/license
  *
  * Date: 2014-01-13
- */\r
-\r
-//     Underscore.js 1.8.3\r
-//     http://underscorejs.org\r
-//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r
-//     Underscore may be freely distributed under the MIT license.\r
-\r
+ */
+
+//     Underscore.js 1.8.3
+//     http://underscorejs.org
+//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+//     Underscore may be freely distributed under the MIT license.
+
 /**
  * @license RequireJS text 2.0.14 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved.
  * Available via the MIT or new BSD license.
  * see: http://github.com/requirejs/text for details
- */\r
-\r
-// RequireJS UnderscoreJS template plugin\r
-// http://github.com/jfparadis/requirejs-tpl\r
-//\r
-// An alternative to http://github.com/ZeeAgency/requirejs-tpl\r
-//\r
-// Using UnderscoreJS micro-templates at http://underscorejs.org/#template\r
-// Using and RequireJS text.js at http://requirejs.org/docs/api.html#text\r
-// @author JF Paradis\r
-// @version 0.0.2\r
-//\r
-// Released under the MIT license\r
-//\r
-// Usage:\r
-//   require(['backbone', 'tpl!mytemplate'], function (Backbone, mytemplate) {\r
-//     return Backbone.View.extend({\r
-//       initialize: function(){\r
-//         this.render();\r
-//       },\r
-//       render: function(){\r
-//         this.$el.html(mytemplate({message: 'hello'}));\r
-//     });\r
-//   });\r
-//\r
-// Configuration: (optional)\r
-//   require.config({\r
-//     tpl: {\r
-//       extension: '.tpl' // default = '.html'\r
-//     }\r
-//   });\r
-\r
+ */
+
+// RequireJS UnderscoreJS template addon
+// http://github.com/jfparadis/requirejs-tpl
+//
+// An alternative to http://github.com/ZeeAgency/requirejs-tpl
+//
+// Using UnderscoreJS micro-templates at http://underscorejs.org/#template
+// Using and RequireJS text.js at http://requirejs.org/docs/api.html#text
+// @author JF Paradis
+// @version 0.0.2
+//
+// Released under the MIT license
+//
+// Usage:
+//   require(['backbone', 'tpl!mytemplate'], function (Backbone, mytemplate) {
+//     return Backbone.View.extend({
+//       initialize: function(){
+//         this.render();
+//       },
+//       render: function(){
+//         this.$el.html(mytemplate({message: 'hello'}));
+//     });
+//   });
+//
+// Configuration: (optional)
+//   require.config({
+//     tpl: {
+//       extension: '.tpl' // default = '.html'
+//     }
+//   });
+
 /*
 jed.js
 v0.5.0beta
@@ -91,10 +91,10 @@ Many thanks to Joshua I. Miller - unrtst@cpan.org - who wrote
 gettext.js back in 2008. I was able to vet a lot of my ideas
 against his. I also made sure Jed passed against his tests
 in order to offer easy upgrades -- jsgettext.berlios.de
-*/\r
-\r
-// Underscore 1.3.0 was used to port and is licensed\r
-\r
+*/
+
+// Underscore 1.3.0 was used to port and is licensed
+
 /**
    sprintf() for JavaScript 0.7-beta1
    http://www.diveintojavascript.com/projects/javascript-sprintf
@@ -123,8 +123,8 @@ in order to offer easy upgrades -- jsgettext.berlios.de
    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-  */\r
-\r
+  */
+
 /*!
  * jQuery Browser Plugin 0.0.8
  * https://github.com/gabceb/jquery-browser-plugin
@@ -138,22 +138,22 @@ in order to offer easy upgrades -- jsgettext.berlios.de
  * Released under the MIT license
  *
  * Date: 05-07-2015
- */\r
-\r
+ */
+
 /*
 CryptoJS v3.1.2
 code.google.com/p/crypto-js
 (c) 2009-2013 by Jeff Mott. All rights reserved.
 code.google.com/p/crypto-js/wiki/License
-*/\r
-\r
+*/
+
 /*!
  * EventEmitter v4.2.3 - git.io/ee
  * Oliver Caldwell
  * MIT license
  * @preserve
- */\r
-\r
+ */
+
 /*!
 
   otr.js v0.2.12 - 2014-04-15
@@ -163,14 +163,14 @@ code.google.com/p/crypto-js/wiki/License
   This file is concatenated for the browser.
   Please see: https://github.com/arlolra/otr
 
-*/\r
-\r
-//! moment.js\r
-//! version : 2.10.6\r
-//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\r
-//! license : MIT\r
-//! momentjs.com\r
-\r
+*/
+
+//! moment.js
+//! version : 2.10.6
+//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
+//! license : MIT
+//! momentjs.com
+
 /*
  * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
  * in FIPS PUB 180-1
@@ -178,8 +178,8 @@ code.google.com/p/crypto-js/wiki/License
  * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
  * Distributed under the BSD License
  * See http://pajhome.org.uk/crypt/md5 for details.
- */\r
-\r
+ */
+
 /*
  * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
  * Digest Algorithm, as defined in RFC 1321.
@@ -187,51 +187,51 @@ code.google.com/p/crypto-js/wiki/License
  * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
  * Distributed under the BSD License
  * See http://pajhome.org.uk/crypt/md5 for more info.
- */\r
-\r
+ */
+
 /*
     This program is distributed under the terms of the MIT license.
     Please see the LICENSE file for details.
 
     Copyright 2006-2008, OGG, LLC
-*/\r
-\r
+*/
+
 /*
   Copyright 2010, François de Metz <francois@2metz.fr>
-*/\r
-\r
+*/
+
 /*
 * Based on Ping Strophejs plugins (https://github.com/metajack/strophejs-plugins/tree/master/ping)
-* This plugin is distributed under the terms of the MIT licence.
+* This addon is distributed under the terms of the MIT licence.
 * Please see the LICENCE file for details.
 *
 * Copyright (c) Markus Kohlhase, 2010
 * Refactored by Pavel Lang, 2011
-*/\r
-\r
-//     (c) 2010-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r
-//     Backbone may be freely distributed under the MIT license.\r
-//     For all details and documentation:\r
-//     http://backbonejs.org\r
-\r
+*/
+
+//     (c) 2010-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+//     Backbone may be freely distributed under the MIT license.
+//     For all details and documentation:
+//     http://backbonejs.org
+
 /*!
  * Backbone.Overview 
  *
  * Copyright (c) 2014, JC Brand <jc@opkode.com>
  * Licensed under the Mozilla Public License (MPL) 
- */\r
-\r
+ */
+
 /*!
  * typeahead.js 0.10.5
  * https://github.com/twitter/typeahead.js
  * Copyright 2013-2014 Twitter, Inc. and other contributors; Licensed MIT
- */\r
-\r
-// Converse.js (A browser based XMPP chat client)\r
-// http://conversejs.org\r
-//\r
-// Copyright (c) 2012-2015, Jan-Carel Brand <jc@opkode.com>\r
-// Licensed under the Mozilla Public License (MPLv2)\r
-//\r
-\r
+ */
+
+// Converse.js (A browser based XMPP chat client)
+// http://conversejs.org
+//
+// Copyright (c) 2012-2015, Jan-Carel Brand <jc@opkode.com>
+// Licensed under the Mozilla Public License (MPLv2)
+//
+
 var requirejs,require,define;(function(e){function h(e,t){return f.call(e,t)}function p(e,t){var n,r,i,s,o,a,f,l,h,p,d,v=t&&t.split("/"),m=u.map,g=m&&m["*"]||{};if(e&&e.charAt(0)===".")if(t){e=e.split("/"),o=e.length-1,u.nodeIdCompat&&c.test(e[o])&&(e[o]=e[o].replace(c,"")),e=v.slice(0,v.length-1).concat(e);for(h=0;h<e.length;h+=1){d=e[h];if(d===".")e.splice(h,1),h-=1;else if(d===".."){if(h===1&&(e[2]===".."||e[0]===".."))break;h>0&&(e.splice(h-1,2),h-=2)}}e=e.join("/")}else e.indexOf("./")===0&&(e=e.substring(2));if((v||g)&&m){n=e.split("/");for(h=n.length;h>0;h-=1){r=n.slice(0,h).join("/");if(v)for(p=v.length;p>0;p-=1){i=m[v.slice(0,p).join("/")];if(i){i=i[r];if(i){s=i,a=h;break}}}if(s)break;!f&&g&&g[r]&&(f=g[r],l=h)}!s&&f&&(s=f,a=l),s&&(n.splice(0,a,s),e=n.join("/"))}return e}function d(t,r){return function(){var i=l.call(arguments,0);return typeof i[0]!="string"&&i.length===1&&i.push(null),n.apply(e,i.concat([t,r]))}}function v(e){return function(t){return p(t,e)}}function m(e){return function(t){s[e]=t}}function g(n){if(h(o,n)){var r=o[n];delete o[n],a[n]=!0,t.apply(e,r)}if(!h(s,n)&&!h(a,n))throw new Error("No "+n);return s[n]}function y(e){var t,n=e?e.indexOf("!"):-1;return n>-1&&(t=e.substring(0,n),e=e.substring(n+1,e.length)),[t,e]}function b(e){return function(){return u&&u.config&&u.config[e]||{}}}var t,n,r,i,s={},o={},u={},a={},f=Object.prototype.hasOwnProperty,l=[].slice,c=/\.js$/;r=function(e,t){var n,r=y(e),i=r[0];return e=r[1],i&&(i=p(i,t),n=g(i)),i?n&&n.normalize?e=n.normalize(e,v(t)):e=p(e,t):(e=p(e,t),r=y(e),i=r[0],e=r[1],i&&(n=g(i))),{f:i?i+"!"+e:e,n:e,pr:i,p:n}},i={require:function(e){return d(e)},exports:function(e){var t=s[e];return typeof t!="undefined"?t:s[e]={}},module:function(e){return{id:e,uri:"",exports:s[e],config:b(e)}}},t=function(t,n,u,f){var l,c,p,v,y,b=[],w=typeof u,E;f=f||t;if(w==="undefined"||w==="function"){n=!n.length&&u.length?["require","exports","module"]:n;for(y=0;y<n.length;y+=1){v=r(n[y],f),c=v.f;if(c==="require")b[y]=i.require(t);else if(c==="exports")b[y]=i.exports(t),E=!0;else if(c==="module")l=b[y]=i.module(t);else if(h(s,c)||h(o,c)||h(a,c))b[y]=g(c);else{if(!v.p)throw new Error(t+" missing "+c);v.p.load(v.n,d(f,!0),m(c),{}),b[y]=s[c]}}p=u?u.apply(s[t],b):undefined;if(t)if(l&&l.exports!==e&&l.exports!==s[t])s[t]=l.exports;else if(p!==e||!E)s[t]=p}else t&&(s[t]=u)},requirejs=require=n=function(s,o,a,f,l){if(typeof s=="string")return i[s]?i[s](o):g(r(s,o).f);if(!s.splice){u=s,u.deps&&n(u.deps,u.callback);if(!o)return;o.splice?(s=o,o=a,a=null):s=e}return o=o||function(){},typeof a=="function"&&(a=f,f=l),f?t(e,s,o,a):setTimeout(function(){t(e,s,o,a)},4),n},n.config=function(e){return n(e)},requirejs._defined=s,define=function(e,t,n){if(typeof e!="string")throw new Error("See almond README: incorrect module build, no module name");t.splice||(n=t,t=[]),!h(s,e)&&!h(o,e)&&(o[e]=[e,t,n])},define.amd={jQuery:!0}})(),define("components/almond/almond.js",function(){}),function(e,t){typeof module=="object"&&typeof module.exports=="object"?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}(typeof window!="undefined"?window:this,function(e,t){function y(e){var t=e.length,n=p.type(e);return n==="function"||p.isWindow(e)?!1:e.nodeType===1&&t?!0:n==="array"||t===0||typeof t=="number"&&t>0&&t-1 in e}function x(e,t,n){if(p.isFunction(t))return p.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return p.grep(e,function(e){return e===t!==n});if(typeof t=="string"){if(S.test(t))return p.filter(t,e,n);t=p.filter(t,e)}return p.grep(e,function(e){return p.inArray(e,t)>=0!==n})}function O(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function D(e){var t=_[e]={};return p.each(e.match(M)||[],function(e,n){t[n]=!0}),t}function H(){N.addEventListener?(N.removeEventListener("DOMContentLoaded",B,!1),e.removeEventListener("load",B,!1)):(N.detachEvent("onreadystatechange",B),e.detachEvent("onload",B))}function B(){if(N.addEventListener||event.type==="load"||N.readyState==="complete")H(),p.ready()}function R(e,t,n){if(n===undefined&&e.nodeType===1){var r="data-"+t.replace(q,"-$1").toLowerCase();n=e.getAttribute(r);if(typeof n=="string"){try{n=n==="true"?!0:n==="false"?!1:n==="null"?null:+n+""===n?+n:I.test(n)?p.parseJSON(n):n}catch(i){}p.data(e,t,n)}else n=undefined}return n}function U(e){var t;for(t in e){if(t==="data"&&p.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function z(e,t,r,i){if(!p.acceptData(e))return;var s,o,u=p.expando,a=e.nodeType,f=a?p.cache:e,l=a?e[u]:e[u]&&u;if((!l||!f[l]||!i&&!f[l].data)&&r===undefined&&typeof t=="string")return;l||(a?l=e[u]=n.pop()||p.guid++:l=u),f[l]||(f[l]=a?{}:{toJSON:p.noop});if(typeof t=="object"||typeof t=="function")i?f[l]=p.extend(f[l],t):f[l].data=p.extend(f[l].data,t);return o=f[l],i||(o.data||(o.data={}),o=o.data),r!==undefined&&(o[p.camelCase(t)]=r),typeof t=="string"?(s=o[t],s==null&&(s=o[p.camelCase(t)])):s=o,s}function W(e,t,n){if(!p.acceptData(e))return;var r,i,s=e.nodeType,o=s?p.cache:e,u=s?e[p.expando]:p.expando;if(!o[u])return;if(t){r=n?o[u]:o[u].data;if(r){p.isArray(t)?t=t.concat(p.map(t,p.camelCase)):t in r?t=[t]:(t=p.camelCase(t),t in r?t=[t]:t=t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!U(r):!p.isEmptyObject(r))return}}if(!n){delete o[u].data;if(!U(o[u]))return}s?p.cleanData([e],!0):c.deleteExpando||o!=o.window?delete o[u]:o[u]=null}function tt(){return!0}function nt(){return!1}function rt(){try{return N.activeElement}catch(e){}}function it(e){var t=st.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Et(e,t){var n,r,i=0,s=typeof e.getElementsByTagName!==j?e.getElementsByTagName(t||"*"):typeof e.querySelectorAll!==j?e.querySelectorAll(t||"*"):undefined;if(!s)for(s=[],n=e.childNodes||e;(r=n[i])!=null;i++)!t||p.nodeName(r,t)?s.push(r):p.merge(s,Et(r,t));return t===undefined||t&&p.nodeName(e,t)?p.merge([e],s):s}function St(e){K.test(e.type)&&(e.defaultChecked=e.checked)}function xt(e,t){return p.nodeName(e,"table")&&p.nodeName(t.nodeType!==11?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Tt(e){return e.type=(p.find.attr(e,"type")!==null)+"/"+e.type,e}function Nt(e){var t=mt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Ct(e,t){var n,r=0;for(;(n=e[r])!=null;r++)p._data(n,"globalEval",!t||p._data(t[r],"globalEval"))}function kt(e,t){if(t.nodeType!==1||!p.hasData(e))return;var n,r,i,s=p._data(e),o=p._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)p.event.add(t,n,u[n][r])}o.data&&(o.data=p.extend({},o.data))}function Lt(e,t){var n,r,i;if(t.nodeType!==1)return;n=t.nodeName.toLowerCase();if(!c.noCloneEvent&&t[p.expando]){i=p._data(t);for(r in i.events)p.removeEvent(t,r,i.handle);t.removeAttribute(p.expando)}if(n==="script"&&t.text!==e.text)Tt(t).text=e.text,Nt(t);else if(n==="object")t.parentNode&&(t.outerHTML=e.outerHTML),c.html5Clone&&e.innerHTML&&!p.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML);else if(n==="input"&&K.test(e.type))t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value);else if(n==="option")t.defaultSelected=t.selected=e.defaultSelected;else if(n==="input"||n==="textarea")t.defaultValue=e.defaultValue}function Mt(t,n){var r=p(n.createElement(t)).appendTo(n.body),i=e.getDefaultComputedStyle?e.getDefaultComputedStyle(r[0]).display:p.css(r[0],"display");return r.detach(),i}function _t(e){var t=N,n=Ot[e];if(!n){n=Mt(e,t);if(n==="none"||!n)At=(At||p("<iframe frameborder='0' width='0' height='0'/>")).appendTo(t.documentElement),t=(At[0].contentWindow||At[0].contentDocument).document,t.write(),t.close(),n=Mt(e,t),At.detach();Ot[e]=n}return n}function Ft(e,t){return{get:function(){var n=e();if(n==null)return;if(n){delete this.get;return}return(this.get=t).apply(this,arguments)}}}function $t(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Vt.length;while(i--){t=Vt[i]+n;if(t in e)return t}return r}function Jt(e,t){var n,r,i,s=[],o=0,u=e.length;for(;o<u;o++){r=e[o];if(!r.style)continue;s[o]=p._data(r,"olddisplay"),n=r.style.display,t?(!s[o]&&n==="none"&&(r.style.display=""),r.style.display===""&&$(r)&&(s[o]=p._data(r,"olddisplay",_t(r.nodeName)))):s[o]||(i=$(r),(n&&n!=="none"||!i)&&p._data(r,"olddisplay",i?n:p.css(r,"display")))}for(o=0;o<u;o++){r=e[o];if(!r.style)continue;if(!t||r.style.display==="none"||r.style.display==="")r.style.display=t?s[o]||"":"none"}return e}function Kt(e,t,n){var r=Ut.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Qt(e,t,n,r,i){var s=n===(r?"border":"content")?4:t==="width"?1:0,o=0;for(;s<4;s+=2)n==="margin"&&(o+=p.css(e,n+V[s],!0,i)),r?(n==="content"&&(o-=p.css(e,"padding"+V[s],!0,i)),n!=="margin"&&(o-=p.css(e,"border"+V[s]+"Width",!0,i))):(o+=p.css(e,"padding"+V[s],!0,i),n!=="padding"&&(o+=p.css(e,"border"+V[s]+"Width",!0,i)));return o}function Gt(e,t,n){var r=!0,i=t==="width"?e.offsetWidth:e.offsetHeight,s=Ht(e),o=c.boxSizing()&&p.css(e,"boxSizing",!1,s)==="border-box";if(i<=0||i==null){i=Bt(e,t,s);if(i<0||i==null)i=e.style[t];if(Pt.test(i))return i;r=o&&(c.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+Qt(e,t,n||(o?"border":"content"),r,s)+"px"}function Yt(e,t,n,r,i){return new Yt.prototype.init(e,t,n,r,i)}function un(){return setTimeout(function(){Zt=undefined}),Zt=p.now()}function an(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=V[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function fn(e,t,n){var r,i=(on[t]||[]).concat(on["*"]),s=0,o=i.length;for(;s<o;s++)if(r=i[s].call(n,t,e))return r}function ln(e,t,n){var r,i,s,o,u,a,f,l,h=this,d={},v=e.style,m=e.nodeType&&$(e),g=p._data(e,"fxshow");n.queue||(u=p._queueHooks(e,"fx"),u.unqueued==null&&(u.unqueued=0,a=u.empty.fire,u.empty.fire=function(){u.unqueued||a()}),u.unqueued++,h.always(function(){h.always(function(){u.unqueued--,p.queue(e,"fx").length||u.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[v.overflow,v.overflowX,v.overflowY],f=p.css(e,"display"),l=_t(e.nodeName),f==="none"&&(f=l),f==="inline"&&p.css(e,"float")==="none"&&(!c.inlineBlockNeedsLayout||l==="inline"?v.display="inline-block":v.zoom=1)),n.overflow&&(v.overflow="hidden",c.shrinkWrapBlocks()||h.always(function(){v.overflow=n.overflow[0],v.overflowX=n.overflow[1],v.overflowY=n.overflow[2]}));for(r in t){i=t[r];if(tn.exec(i)){delete t[r],s=s||i==="toggle";if(i===(m?"hide":"show")){if(i!=="show"||!g||g[r]===undefined)continue;m=!0}d[r]=g&&g[r]||p.style(e,r)}}if(!p.isEmptyObject(d)){g?"hidden"in g&&(m=g.hidden):g=p._data(e,"fxshow",{}),s&&(g.hidden=!m),m?p(e).show():h.done(function(){p(e).hide()}),h.done(function(){var t;p._removeData(e,"fxshow");for(t in d)p.style(e,t,d[t])});for(r in d)o=fn(m?g[r]:0,r,h),r in g||(g[r]=o.start,m&&(o.end=o.start,o.start=r==="width"||r==="height"?1:0))}}function cn(e,t){var n,r,i,s,o;for(n in e){r=p.camelCase(n),i=t[r],s=e[n],p.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=p.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function hn(e,t,n){var r,i,s=0,o=sn.length,u=p.Deferred().always(function(){delete a.elem}),a=function(){if(i)return!1;var t=Zt||un(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,s=1-r,o=0,a=f.tweens.length;for(;o<a;o++)f.tweens[o].run(s);return u.notifyWith(e,[f,s,n]),s<1&&a?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:p.extend({},t),opts:p.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Zt||un(),duration:n.duration,tweens:[],createTween:function(t,n){var r=p.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(r),r},stop:function(t){var n=0,r=t?f.tweens.length:0;if(i)return this;i=!0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;cn(l,f.opts.specialEasing);for(;s<o;s++){r=sn[s].call(f,e,l,f.opts);if(r)return r}return p.map(l,fn,f),p.isFunction(f.opts.start)&&f.opts.start.call(e,f),p.fx.timer(p.extend(a,{elem:e,anim:f,queue:f.opts.queue})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function In(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i=0,s=t.toLowerCase().match(M)||[];if(p.isFunction(n))while(r=s[i++])r.charAt(0)==="+"?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,t,n,r){function o(u){var a;return i[u]=!0,p.each(e[u]||[],function(e,u){var f=u(t,n,r);if(typeof f=="string"&&!s&&!i[f])return t.dataTypes.unshift(f),o(f),!1;if(s)return!(a=f)}),a}var i={},s=e===Bn;return o(t.dataTypes[0])||!i["*"]&&o("*")}function Rn(e,t){var n,r,i=p.ajaxSettings.flatOptions||{};for(r in t)t[r]!==undefined&&((i[r]?e:n||(n={}))[r]=t[r]);return n&&p.extend(!0,e,n),e}function Un(e,t,n){var r,i,s,o,u=e.contents,a=e.dataTypes;while(a[0]==="*")a.shift(),i===undefined&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(o in u)if(u[o]&&u[o].test(i)){a.unshift(o);break}if(a[0]in n)s=a[0];else{for(o in n){if(!a[0]||e.converters[o+" "+a[0]]){s=o;break}r||(r=o)}s=s||r}if(s)return s!==a[0]&&a.unshift(s),n[s]}function zn(e,t,n,r){var i,s,o,u,a,f={},l=e.dataTypes.slice();if(l[1])for(o in e.converters)f[o.toLowerCase()]=e.converters[o];s=l.shift();while(s){e.responseFields[s]&&(n[e.responseFields[s]]=t),!a&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),a=s,s=l.shift();if(s)if(s==="*")s=a;else if(a!=="*"&&a!==s){o=f[a+" "+s]||f["* "+s];if(!o)for(i in f){u=i.split(" ");if(u[1]===s){o=f[a+" "+u[0]]||f["* "+u[0]];if(o){o===!0?o=f[i]:f[i]!==!0&&(s=u[0],l.unshift(u[1]));break}}}if(o!==!0)if(o&&e["throws"])t=o(t);else try{t=o(t)}catch(c){return{state:"parsererror",error:o?c:"No conversion from "+a+" to "+s}}}}return{state:"success",data:t}}function Kn(e,t,n,r){var i;if(p.isArray(t))p.each(t,function(t,i){n||Xn.test(e)?r(e,i):Kn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&p.type(t)==="object")for(i in t)Kn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Zn(){try{return new e.XMLHttpRequest}catch(t){}}function er(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function sr(e){return p.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n=[],r=n.slice,i=n.concat,s=n.push,o=n.indexOf,u={},a=u.toString,f=u.hasOwnProperty,l="".trim,c={},h="1.11.0",p=function(e,t){return new p.fn.init(e,t)},d=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,v=/^-ms-/,m=/-([\da-z])/gi,g=function(e,t){return t.toUpperCase()};p.fn=p.prototype={jquery:h,constructor:p,selector:"",length:0,toArray:function(){return r.call(this)},get:function(e){return e!=null?e<0?this[e+this.length]:this[e]:r.call(this)},pushStack:function(e){var t=p.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return p.each(this,e,t)},map:function(e){return this.pushStack(p.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(r.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:s,sort:n.sort,splice:n.splice},p.extend=p.fn.extend=function(){var e,t,n,r,i,s,o=arguments[0]||{},u=1,a=arguments.length,f=!1;typeof o=="boolean"&&(f=o,o=arguments[u]||{},u++),typeof o!="object"&&!p.isFunction(o)&&(o={}),u===a&&(o=this,u--);for(;u<a;u++)if((i=arguments[u])!=null)for(r in i){e=o[r],n=i[r];if(o===n)continue;f&&n&&(p.isPlainObject(n)||(t=p.isArray(n)))?(t?(t=!1,s=e&&p.isArray(e)?e:[]):s=e&&p.isPlainObject(e)?e:{},o[r]=p.extend(f,s,n)):n!==undefined&&(o[r]=n)}return o},p.extend({expando:"jQuery"+(h+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isFunction:function(e){return p.type(e)==="function"},isArray:Array.isArray||function(e){return p.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return e-parseFloat(e)>=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||p.type(e)!=="object"||e.nodeType||p.isWindow(e))return!1;try{if(e.constructor&&!f.call(e,"constructor")&&!f.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(c.ownLast)for(t in e)return f.call(e,t);for(t in e);return t===undefined||f.call(e,t)},type:function(e){return e==null?e+"":typeof e=="object"||typeof e=="function"?u[a.call(e)]||"object":typeof e},globalEval:function(t){t&&p.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(v,"ms-").replace(m,g)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,s=e.length,o=y(e);if(n)if(o)for(;i<s;i++){r=t.apply(e[i],n);if(r===!1)break}else for(i in e){r=t.apply(e[i],n);if(r===!1)break}else if(o)for(;i<s;i++){r=t.call(e[i],i,e[i]);if(r===!1)break}else for(i in e){r=t.call(e[i],i,e[i]);if(r===!1)break}return e},trim:l&&!l.call(" ")?function(e){return e==null?"":l.call(e)}:function(e){return e==null?"":(e+"").replace(d,"")},makeArray:function(e,t){var n=t||[];return e!=null&&(y(Object(e))?p.merge(n,typeof e=="string"?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(o)return o.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,t){var n=+t.length,r=0,i=e.length;while(r<n)e[i++]=t[r++];if(n!==n)while(t[r]!==undefined)e[i++]=t[r++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length,u=!n;for(;s<o;s++)r=!t(e[s],s),r!==u&&i.push(e[s]);return i},map:function(e,t,n){var r,s=0,o=e.length,u=y(e),a=[];if(u)for(;s<o;s++)r=t(e[s],s,n),r!=null&&a.push(r);else for(s in e)r=t(e[s],s,n),r!=null&&a.push(r);return i.apply([],a)},guid:1,proxy:function(e,t){var n,i,s;return typeof t=="string"&&(s=e[t],t=e,e=s),p.isFunction(e)?(n=r.call(arguments,2),i=function(){return e.apply(t||this,n.concat(r.call(arguments)))},i.guid=e.guid=e.guid||p.guid++,i):undefined},now:function(){return+(new Date)},support:c}),p.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){u["[object "+t+"]"]=t.toLowerCase()});var b=function(e){function rt(e,t,r,i){var s,o,u,a,f,h,v,m,w,E;(t?t.ownerDocument||t:b)!==c&&l(t),t=t||c,r=r||[];if(!e||typeof e!="string")return r;if((a=t.nodeType)!==1&&a!==9)return[];if(p&&!i){if(s=G.exec(e))if(u=s[1]){if(a===9){o=t.getElementById(u);if(!o||!o.parentNode)return r;if(o.id===u)return r.push(o),r}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(u))&&g(t,o)&&o.id===u)return r.push(o),r}else{if(s[2])return _.apply(r,t.getElementsByTagName(e)),r;if((u=s[3])&&n.getElementsByClassName&&t.getElementsByClassName)return _.apply(r,t.getElementsByClassName(u)),r}if(n.qsa&&(!d||!d.test(e))){m=v=y,w=t,E=a===9&&e;if(a===1&&t.nodeName.toLowerCase()!=="object"){h=dt(e),(v=t.getAttribute("id"))?m=v.replace(Z,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",f=h.length;while(f--)h[f]=m+vt(h[f]);w=Y.test(e)&&ht(t.parentNode)||t,E=h.join(",")}if(E)try{return _.apply(r,w.querySelectorAll(E)),r}catch(S){}finally{v||t.removeAttribute("id")}}}return xt(e.replace(R,"$1"),t,r,i)}function it(){function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}var e=[];return t}function st(e){return e[y]=!0,e}function ot(e){var t=c.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ut(e,t){var n=e.split("|"),i=e.length;while(i--)r.attrHandle[n[i]]=t}function at(e,t){var n=t&&e,r=n&&e.nodeType===1&&t.nodeType===1&&(~t.sourceIndex||k)-(~e.sourceIndex||k);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function ct(e){return st(function(t){return t=+t,st(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ht(e){return e&&typeof e.getElementsByTagName!==C&&e}function pt(){}function dt(e,t){var n,i,s,o,u,a,f,l=x[e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=r.preFilter;while(u){if(!n||(i=U.exec(u)))i&&(u=u.slice(i[0].length)||u),a.push(s=[]);n=!1;if(i=z.exec(u))n=i.shift(),s.push({value:n,type:i[0].replace(R," ")}),u=u.slice(n.length);for(o in r.filter)(i=$[o].exec(u))&&(!f[o]||(i=f[o](i)))&&(n=i.shift(),s.push({value:n,type:o,matches:i}),u=u.slice(n.length));if(!n)break}return t?u.length:u?rt.error(e):x(e,a).slice(0)}function vt(e){var t=0,n=e.length,r="";for(;t<n;t++)r+=e[t].value;return r}function mt(e,t,n){var r=t.dir,i=n&&r==="parentNode",s=E++;return t.first?function(t,n,s){while(t=t[r])if(t.nodeType===1||i)return e(t,n,s)}:function(t,n,o){var u,a,f=[w,s];if(o){while(t=t[r])if(t.nodeType===1||i)if(e(t,n,o))return!0}else while(t=t[r])if(t.nodeType===1||i){a=t[y]||(t[y]={});if((u=a[r])&&u[0]===w&&u[1]===s)return f[2]=u[2];a[r]=f;if(f[2]=e(t,n,o))return!0}}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function yt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function bt(e,t,n,r,i,s){return r&&!r[y]&&(r=bt(r)),i&&!i[y]&&(i=bt(i,s)),st(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||St(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?yt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=yt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?P.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=yt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):_.apply(o,g)})}function wt(e){var t,n,i,s=e.length,o=r.relative[e[0].type],a=o||r.relative[" "],f=o?1:0,l=mt(function(e){return e===t},a,!0),c=mt(function(e){return P.call(t,e)>-1},a,!0),h=[function(e,n,r){return!o&&(r||n!==u)||((t=n).nodeType?l(e,n,r):c(e,n,r))}];for(;f<s;f++)if(n=r.relative[e[f].type])h=[mt(gt(h),n)];else{n=r.filter[e[f].type].apply(null,e[f].matches);if(n[y]){i=++f;for(;i<s;i++)if(r.relative[e[i].type])break;return bt(f>1&&gt(h),f>1&&vt(e.slice(0,f-1).concat({value:e[f-2].type===" "?"*":""})).replace(R,"$1"),n,f<i&&wt(e.slice(f,i)),i<s&&wt(e=e.slice(i)),i<s&&vt(e))}h.push(n)}return gt(h)}function Et(e,t){var n=t.length>0,i=e.length>0,s=function(s,o,a,f,l){var h,p,d,v=0,m="0",g=s&&[],y=[],b=u,E=s||i&&r.find.TAG("*",l),S=w+=b==null?1:Math.random()||.1,x=E.length;l&&(u=o!==c&&o);for(;m!==x&&(h=E[m])!=null;m++){if(i&&h){p=0;while(d=e[p++])if(d(h,o,a)){f.push(h);break}l&&(w=S)}n&&((h=!d&&h)&&v--,s&&g.push(h))}v+=m;if(n&&m!==v){p=0;while(d=t[p++])d(g,y,o,a);if(s){if(v>0)while(m--)!g[m]&&!y[m]&&(y[m]=O.call(f));y=yt(y)}_.apply(f,y),l&&!s&&y.length>0&&v+t.length>1&&rt.uniqueSort(f)}return l&&(w=S,u=b),g};return n?st(s):s}function St(e,t,n){var r=0,i=t.length;for(;r<i;r++)rt(e,t[r],n);return n}function xt(e,t,i,s){var u,a,f,l,c,h=dt(e);if(!s&&h.length===1){a=h[0]=h[0].slice(0);if(a.length>2&&(f=a[0]).type==="ID"&&n.getById&&t.nodeType===9&&p&&r.relative[a[1].type]){t=(r.find.ID(f.matches[0].replace(et,tt),t)||[])[0];if(!t)return i;e=e.slice(a.shift().value.length)}u=$.needsContext.test(e)?0:a.length;while(u--){f=a[u];if(r.relative[l=f.type])break;if(c=r.find[l])if(s=c(f.matches[0].replace(et,tt),Y.test(a[0].type)&&ht(t.parentNode)||t)){a.splice(u,1),e=s.length&&vt(a);if(!e)return _.apply(i,s),i;break}}}return o(e,h)(s,t,!p,i,Y.test(e)&&ht(t.parentNode)||t),i}var t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y="sizzle"+ -(new Date),b=e.document,w=0,E=0,S=it(),x=it(),T=it(),N=function(e,t){return e===t&&(f=!0),0},C=typeof undefined,k=1<<31,L={}.hasOwnProperty,A=[],O=A.pop,M=A.push,_=A.push,D=A.slice,P=A.indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},H="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",B="[\\x20\\t\\r\\n\\f]",j="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",F=j.replace("w","w#"),I="\\["+B+"*("+j+")"+B+"*(?:([*^$|!~]?=)"+B+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+F+")|)|)"+B+"*\\]",q=":("+j+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+I.replace(3,8)+")*)|.*)\\)|)",R=new RegExp("^"+B+"+|((?:^|[^\\\\])(?:\\\\.)*)"+B+"+$","g"),U=new RegExp("^"+B+"*,"+B+"*"),z=new RegExp("^"+B+"*([>+~]|"+B+")"+B+"*"),W=new RegExp("="+B+"*([^\\]'\"]*?)"+B+"*\\]","g"),X=new RegExp(q),V=new RegExp("^"+F+"$"),$={ID:new RegExp("^#("+j+")"),CLASS:new RegExp("^\\.("+j+")"),TAG:new RegExp("^("+j.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+B+"*(even|odd|(([+-]|)(\\d*)n|)"+B+"*(?:([+-]|)"+B+"*(\\d+)|))"+B+"*\\)|)","i"),bool:new RegExp("^(?:"+H+")$","i"),needsContext:new RegExp("^"+B+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+B+"*((?:-\\d)?\\d*)"+B+"*\\)|)(?=[^-]|$)","i")},J=/^(?:input|select|textarea|button)$/i,K=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,G=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Y=/[+~]/,Z=/'|\\/g,et=new RegExp("\\\\([\\da-f]{1,6}"+B+"?|("+B+")|.)","ig"),tt=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,r&1023|56320)};try{_.apply(A=D.call(b.childNodes),b.childNodes),A[b.childNodes.length].nodeType}catch(nt){_={apply:A.length?function(e,t){M.apply(e,D.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}n=rt.support={},s=rt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},l=rt.setDocument=function(e){var t,i=e?e.ownerDocument||e:b,o=i.defaultView;if(i===c||i.nodeType!==9||!i.documentElement)return c;c=i,h=i.documentElement,p=!s(i),o&&o!==o.top&&(o.addEventListener?o.addEventListener("unload",function(){l()},!1):o.attachEvent&&o.attachEvent("onunload",function(){l()})),n.attributes=ot(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ot(function(e){return e.appendChild(i.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(i.getElementsByClassName)&&ot(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",e.getElementsByClassName("i").length===2}),n.getById=ot(function(e){return h.appendChild(e).id=y,!i.getElementsByName||!i.getElementsByName(y).length}),n.getById?(r.find.ID=function(e,t){if(typeof t.getElementById!==C&&p){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},r.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(delete r.find.ID,r.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==C&&e.getAttributeNode("id");return n&&n.value===t}}),r.find.TAG=n.getElementsByTagName?function(e,t){if(typeof t.getElementsByTagName!==C)return t.getElementsByTagName(e)}:function(e,t){var n,r=[],i=0,s=t.getElementsByTagName(e);if(e==="*"){while(n=s[i++])n.nodeType===1&&r.push(n);return r}return s},r.find.CLASS=n.getElementsByClassName&&function(e,t){if(typeof t.getElementsByClassName!==C&&p)return t.getElementsByClassName(e)},v=[],d=[];if(n.qsa=Q.test(i.querySelectorAll))ot(function(e){e.innerHTML="<select t=''><option selected=''></option></select>",e.querySelectorAll("[t^='']").length&&d.push("[*^$]="+B+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||d.push("\\["+B+"*(?:value|"+H+")"),e.querySelectorAll(":checked").length||d.push(":checked")}),ot(function(e){var t=i.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&d.push("name"+B+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")});return(n.matchesSelector=Q.test(m=h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ot(function(e){n.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),v.push("!=",q)}),d=d.length&&new RegExp(d.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),g=t||Q.test(h.contains)?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!r&&r.nodeType===1&&!!(n.contains?n.contains(r):e.compareDocumentPosition&&e.compareDocumentPosition(r)&16)}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},N=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r?r:(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,r&1||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===i||e.ownerDocument===b&&g(b,e)?-1:t===i||t.ownerDocument===b&&g(b,t)?1:a?P.call(a,e)-P.call(a,t):0:r&4?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,s=e.parentNode,o=t.parentNode,u=[e],l=[t];if(!s||!o)return e===i?-1:t===i?1:s?-1:o?1:a?P.call(a,e)-P.call(a,t):0;if(s===o)return at(e,t);n=e;while(n=n.parentNode)u.unshift(n);n=t;while(n=n.parentNode)l.unshift(n);while(u[r]===l[r])r++;return r?at(u[r],l[r]):u[r]===b?-1:l[r]===b?1:0},i},rt.matches=function(e,t){return rt(e,null,null,t)},rt.matchesSelector=function(e,t){(e.ownerDocument||e)!==c&&l(e),t=t.replace(W,"='$1']");if(n.matchesSelector&&p&&(!v||!v.test(t))&&(!d||!d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&e.document.nodeType!==11)return r}catch(i){}return rt(t,c,null,[e]).length>0},rt.contains=function(e,t){return(e.ownerDocument||e)!==c&&l(e),g(e,t)},rt.attr=function(e,t){(e.ownerDocument||e)!==c&&l(e);var i=r.attrHandle[t.toLowerCase()],s=i&&L.call(r.attrHandle,t.toLowerCase())?i(e,t,!p):undefined;return s!==undefined?s:n.attributes||!p?e.getAttribute(t):(s=e.getAttributeNode(t))&&s.specified?s.value:null},rt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},rt.uniqueSort=function(e){var t,r=[],i=0,s=0;f=!n.detectDuplicates,a=!n.sortStable&&e.slice(0),e.sort(N);if(f){while(t=e[s++])t===e[s]&&(i=r.push(s));while(i--)e.splice(r[i],1)}return a=null,e},i=rt.getText=function(e){var t,n="",r=0,s=e.nodeType;if(!s)while(t=e[r++])n+=i(t);else if(s===1||s===9||s===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(s===3||s===4)return e.nodeValue;return n},r=rt.selectors={cacheLength:50,createPseudo:st,match:$,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1].slice(0,3)==="nth"?(e[3]||rt.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(e[3]==="even"||e[3]==="odd")),e[5]=+(e[7]+e[8]||e[3]==="odd")):e[3]&&rt.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return $.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&X.test(n)&&(t=dt(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(et,tt).toLowerCase();return e==="*"?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=S[e+" "];return t||(t=new RegExp("(^|"+B+")"+e+"("+B+"|$)"))&&S(e,function(e){return t.test(typeof e.className=="string"&&e.className||typeof e.getAttribute!==C&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=rt.attr(r,e);return i==null?t==="!=":t?(i+="",t==="="?i===n:t==="!="?i!==n:t==="^="?n&&i.indexOf(n)===0:t==="*="?n&&i.indexOf(n)>-1:t==="$="?n&&i.slice(-n.length)===n:t==="~="?(" "+i+" ").indexOf(n)>-1:t==="|="?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var s=e.slice(0,3)!=="nth",o=e.slice(-4)!=="last",u=t==="of-type";return r===1&&i===0?function(e){return!!e.parentNode}:function(t,n,a){var f,l,c,h,p,d,v=s!==o?"nextSibling":"previousSibling",m=t.parentNode,g=u&&t.nodeName.toLowerCase(),b=!a&&!u;if(m){if(s){while(v){c=t;while(c=c[v])if(u?c.nodeName.toLowerCase()===g:c.nodeType===1)return!1;d=v=e==="only"&&!d&&"nextSibling"}return!0}d=[o?m.firstChild:m.lastChild];if(o&&b){l=m[y]||(m[y]={}),f=l[e]||[],p=f[0]===w&&f[1],h=f[0]===w&&f[2],c=p&&m.childNodes[p];while(c=++p&&c&&c[v]||(h=p=0)||d.pop())if(c.nodeType===1&&++h&&c===t){l[e]=[w,p,h];break}}else if(b&&(f=(t[y]||(t[y]={}))[e])&&f[0]===w)h=f[1];else while(c=++p&&c&&c[v]||(h=p=0)||d.pop())if((u?c.nodeName.toLowerCase()===g:c.nodeType===1)&&++h){b&&((c[y]||(c[y]={}))[e]=[w,h]);if(c===t)break}return h-=i,h===r||h%r===0&&h/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||rt.error("unsupported pseudo: "+e);return i[y]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?st(function(e,n){var r,s=i(e,t),o=s.length;while(o--)r=P.call(e,s[o]),e[r]=!(n[r]=s[o])}):function(e){return i(e,0,n)}):i}},pseudos:{not:st(function(e){var t=[],n=[],r=o(e.replace(R,"$1"));return r[y]?st(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:st(function(e){return function(t){return rt(e,t).length>0}}),contains:st(function(e){return function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:st(function(e){return V.test(e||"")||rt.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=p?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||n.indexOf(e+"-")===0;while((t=t.parentNode)&&t.nodeType===1);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===c.activeElement&&(!c.hasFocus||c.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return K.test(e.nodeName)},input:function(e){return J.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},text:function(e){var t;return e.nodeName.toLowerCase()==="input"&&e.type==="text"&&((t=e.getAttribute("type"))==null||t.toLowerCase()==="text")},first:ct(function(){return[0]}),last:ct(function(e,t){return[t-1]}),eq:ct(function(e,t,n){return[n<0?n+t:n]}),even:ct(function(e,t){var n=0;for(;n<t;n+=2)e.push(n);return e}),odd:ct(function(e,t){var n=1;for(;n<t;n+=2)e.push(n);return e}),lt:ct(function(e,t,n){var r=n<0?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ct(function(e,t,n){var r=n<0?n+t:n;for(;++r<t;)e.push(r);return e})}},r.pseudos.nth=r.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})r.pseudos[t]=ft(t);for(t in{submit:!0,reset:!0})r.pseudos[t]=lt(t);return pt.prototype=r.filters=r.pseudos,r.setFilters=new pt,o=rt.compile=function(e,t){var n,r=[],i=[],s=T[e+" "];if(!s){t||(t=dt(e)),n=t.length;while(n--)s=wt(t[n]),s[y]?r.push(s):i.push(s);s=T(e,Et(i,r))}return s},n.sortStable=y.split("").sort(N).join("")===y,n.detectDuplicates=!!f,l(),n.sortDetached=ot(function(e){return e.compareDocumentPosition(c.createElement("div"))&1}),ot(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild.getAttribute("href")==="#"})||ut("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,t.toLowerCase()==="type"?1:2)}),(!n.attributes||!ot(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),e.firstChild.getAttribute("value")===""}))&&ut("value",function(e,t,n){if(!n&&e.nodeName.toLowerCase()==="input")return e.defaultValue}),ot(function(e){return e.getAttribute("disabled")==null})||ut(H,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),rt}(e);p.find=b,p.expr=b.selectors,p.expr[":"]=p.expr.pseudos,p.unique=b.uniqueSort,p.text=b.getText,p.isXMLDoc=b.isXML,p.contains=b.contains;var w=p.expr.match.needsContext,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^.[^:#\[\.,]*$/;p.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),t.length===1&&r.nodeType===1?p.find.matchesSelector(r,e)?[r]:[]:p.find.matches(e,p.grep(t,function(e){return e.nodeType===1}))},p.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if(typeof e!="string")return this.pushStack(p(e).filter(function(){for(t=0;t<i;t++)if(p.contains(r[t],this))return!0}));for(t=0;t<i;t++)p.find(e,r[t],n);return n=this.pushStack(i>1?p.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(x(this,e||[],!1))},not:function(e){return this.pushStack(x(this,e||[],!0))},is:function(e){return!!x(this,typeof e=="string"&&w.test(e)?p(e):e||[],!1).length}});var T,N=e.document,C=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=p.fn.init=function(e,t){var n,r;if(!e)return this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?n=[null,e,null]:n=C.exec(e);if(n&&(n[1]||!t)){if(n[1]){t=t instanceof p?t[0]:t,p.merge(this,p.parseHTML(n[1],t&&t.nodeType?t.ownerDocument||t:N,!0));if(E.test(n[1])&&p.isPlainObject(t))for(n in t)p.isFunction(this[n])?this[n](t[n]):this.attr(n,t[n]);return this}r=N.getElementById(n[2]);if(r&&r.parentNode){if(r.id!==n[2])return T.find(e);this.length=1,this[0]=r}return this.context=N,this.selector=e,this}return!t||t.jquery?(t||T).find(e):this.constructor(t).find(e)}return e.nodeType?(this.context=this[0]=e,this.length=1,this):p.isFunction(e)?typeof T.ready!="undefined"?T.ready(e):e(p):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),p.makeArray(e,this))};k.prototype=p.fn,T=p(N);var L=/^(?:parents|prev(?:Until|All))/,A={children:!0,contents:!0,next:!0,prev:!0};p.extend({dir:function(e,t,n){var r=[],i=e[t];while(i&&i.nodeType!==9&&(n===undefined||i.nodeType!==1||!p(i).is(n)))i.nodeType===1&&r.push(i),i=i[t];return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}}),p.fn.extend({has:function(e){var t,n=p(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(p.contains(this,n[t]))return!0})},closest:function(e,t){var n,r=0,i=this.length,s=[],o=w.test(e)||typeof e!="string"?p(e,t||this.context):0;for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(o?o.index(n)>-1:n.nodeType===1&&p.find.matchesSelector(n,e))){s.push(n);break}return this.pushStack(s.length>1?p.unique(s):s)},index:function(e){return e?typeof e=="string"?p.inArray(this[0],p(e)):p.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(p.unique(p.merge(this.get(),p(e,t))))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),p.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return p.dir(e,"parentNode")},parentsUntil:function(e,t,n){return p.dir(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return p.dir(e,"nextSibling")},prevAll:function(e){return p.dir(e,"previousSibling")},nextUntil:function(e,t,n){return p.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return p.dir(e,"previousSibling",n)},siblings:function(e){return p.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return p.sibling(e.firstChild)},contents:function(e){return p.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:p.merge([],e.childNodes)}},function(e,t){p.fn[e]=function(n,r){var i=p.map(this,t,n);return e.slice(-5)!=="Until"&&(r=n),r&&typeof r=="string"&&(i=p.filter(r,i)),this.length>1&&(A[e]||(i=p.unique(i)),L.test(e)&&(i=i.reverse())),this.pushStack(i)}});var M=/\S+/g,_={};p.Callbacks=function(e){e=typeof e=="string"?_[e]||D(e):p.extend({},e);var t,n,r,i,s,o,u=[],a=!e.once&&[],f=function(c){n=e.memory&&c,r=!0,s=o||0,o=0,i=u.length,t=!0;for(;u&&s<i;s++)if(u[s].apply(c[0],c[1])===!1&&e.stopOnFalse){n=!1;break}t=!1,u&&(a?a.length&&f(a.shift()):n?u=[]:l.disable())},l={add:function(){if(u){var r=u.length;(function s(t){p.each(t,function(t,n){var r=p.type(n);r==="function"?(!e.unique||!l.has(n))&&u.push(n):n&&n.length&&r!=="string"&&s(n)})})(arguments),t?i=u.length:n&&(o=r,f(n))}return this},remove:function(){return u&&p.each(arguments,function(e,n){var r;while((r=p.inArray(n,u,r))>-1)u.splice(r,1),t&&(r<=i&&i--,r<=s&&s--)}),this},has:function(e){return e?p.inArray(e,u)>-1:!!u&&!!u.length},empty:function(){return u=[],i=0,this},disable:function(){return u=a=n=undefined,this},disabled:function(){return!u},lock:function(){return a=undefined,n||l.disable(),this},locked:function(){return!a},fireWith:function(e,n){return u&&(!r||a)&&(n=n||[],n=[e,n.slice?n.slice():n],t?a.push(n):f(n)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},p.extend({Deferred:function(e){var t=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return p.Deferred(function(n){p.each(t,function(t,s){var o=p.isFunction(e[t])&&e[t];i[s[1]](function(){var e=o&&o.apply(this,arguments);e&&p.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s[0]+"With"](this===r?n.promise():this,o?[e]:arguments)})}),e=null}).promise()},promise:function(e){return e!=null?p.extend(e,r):r}},i={};return r.pipe=r.then,p.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=function(){return i[s[0]+"With"](this===i?r:this,arguments),this},i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=r.call(arguments),i=n.length,s=i!==1||e&&p.isFunction(e.promise)?i:0,o=s===1?e:p.Deferred(),u=function(e,t,n){return function(i){t[e]=this,n[e]=arguments.length>1?r.call(arguments):i,n===a?o.notifyWith(t,n):--s||o.resolveWith(t,n)}},a,f,l;if(i>1){a=new Array(i),f=new Array(i),l=new Array(i);for(;t<i;t++)n[t]&&p.isFunction(n[t].promise)?n[t].promise().done(u(t,l,n)).fail(o.reject).progress(u(t,f,a)):--s}return s||o.resolveWith(l,n),o.promise()}});var P;p.fn.ready=function(e){return p.ready.promise().done(e),this},p.extend({isReady:!1,readyWait:1,holdReady:function(e){e?p.readyWait++:p.ready(!0)},ready:function(e){if(e===!0?--p.readyWait:p.isReady)return;if(!N.body)return setTimeout(p.ready);p.isReady=!0;if(e!==!0&&--p.readyWait>0)return;P.resolveWith(N,[p]),p.fn.trigger&&p(N).trigger("ready").off("ready")}}),p.ready.promise=function(t){if(!P){P=p.Deferred();if(N.readyState==="complete")setTimeout(p.ready);else if(N.addEventListener)N.addEventListener("DOMContentLoaded",B,!1),e.addEventListener("load",B,!1);else{N.attachEvent("onreadystatechange",B),e.attachEvent("onload",B);var n=!1;try{n=e.frameElement==null&&N.documentElement}catch(r){}n&&n.doScroll&&function i(){if(!p.isReady){try{n.doScroll("left")}catch(e){return setTimeout(i,50)}H(),p.ready()}}()}}return P.promise(t)};var j=typeof undefined,F;for(F in p(c))break;c.ownLast=F!=="0",c.inlineBlockNeedsLayout=!1,p(function(){var e,t,n=N.getElementsByTagName("body")[0];if(!n)return;e=N.createElement("div"),e.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",t=N.createElement("div"),n.appendChild(e).appendChild(t);if(typeof t.style.zoom!==j){t.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1";if(c.inlineBlockNeedsLayout=t.offsetWidth===3)n.style.zoom=1}n.removeChild(e),e=t=null}),function(){var e=N.createElement("div");if(c.deleteExpando==null){c.deleteExpando=!0;try{delete e.test}catch(t){c.deleteExpando=!1}}e=null}(),p.acceptData=function(e){var t=p.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return n!==1&&n!==9?!1:!t||t!==!0&&e.getAttribute("classid")===t};var I=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,q=/([A-Z])/g;p.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?p.cache[e[p.expando]]:e[p.expando],!!e&&!U(e)},data:function(e,t,n){return z(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return z(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)}}),p.fn.extend({data:function(e,t){var n,r,i,s=this[0],o=s&&s.attributes;if(e===undefined){if(this.length){i=p.data(s);if(s.nodeType===1&&!p._data(s,"parsedAttrs")){n=o.length;while(n--)r=o[n].name,r.indexOf("data-")===0&&(r=p.camelCase(r.slice(5)),R(s,r,i[r]));p._data(s,"parsedAttrs",!0)}}return i}return typeof e=="object"?this.each(function(){p.data(this,e)}):arguments.length>1?this.each(function(){p.data(this,e,t)}):s?R(s,e,p.data(s,e)):undefined},removeData:function(e){return this.each(function(){p.removeData(this,e)})}}),p.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=p._data(e,t),n&&(!r||p.isArray(n)?r=p._data(e,t,p.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=p.queue(e,t),r=n.length,i=n.shift(),s=p._queueHooks(e,t),o=function(){p.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return p._data(e,n)||p._data(e,n,{empty:p.Callbacks("once memory").add(function(){p._removeData(e,t+"queue"),p._removeData(e,n)})})}}),p.fn.extend({queue:function(e,t){var n=2;return typeof e!="string"&&(t=e,e="fx",n--),arguments.length<n?p.queue(this[0],e):t===undefined?this:this.each(function(){var n=p.queue(this,e,t);p._queueHooks(this,e),e==="fx"&&n[0]!=="inprogress"&&p.dequeue(this,e)})},dequeue:function(e){return this.each(function(){p.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=p.Deferred(),s=this,o=this.length,u=function(){--r||i.resolveWith(s,[s])};typeof e!="string"&&(t=e,e=undefined),e=e||"fx";while(o--)n=p._data(s[o],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(u));return u(),i.promise(t)}});var X=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,V=["Top","Right","Bottom","Left"],$=function(e,t){return e=t||e,p.css(e,"display")==="none"||!p.contains(e.ownerDocument,e)},J=p.access=function(e,t,n,r,i,s,o){var u=0,a=e.length,f=n==null;if(p.type(n)==="object"){i=!0;for(u in n)p.access(e,t,u,n[u],!0,s,o)}else if(r!==undefined){i=!0,p.isFunction(r)||(o=!0),f&&(o?(t.call(e,r),t=null):(f=t,t=function(e,t,n){return f.call(p(e),n)}));if(t)for(;u<a;u++)t(e[u],n,o?r:r.call(e[u],u,t(e[u],n)))}return i?e:f?t.call(e):a?t(e[0],n):s},K=/^(?:checkbox|radio)$/i;(function(){var e=N.createDocumentFragment(),t=N.createElement("div"),n=N.createElement("input");t.setAttribute("className","t"),t.innerHTML="  <link/><table></table><a href='/a'>a</a>",c.leadingWhitespace=t.firstChild.nodeType===3,c.tbody=!t.getElementsByTagName("tbody").length,c.htmlSerialize=!!t.getElementsByTagName("link").length,c.html5Clone=N.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",n.type="checkbox",n.checked=!0,e.appendChild(n),c.appendChecked=n.checked,t.innerHTML="<textarea>x</textarea>",c.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue,e.appendChild(t),t.innerHTML="<input type='radio' checked='checked' name='t'/>",c.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,c.noCloneEvent=!0,t.attachEvent&&(t.attachEvent("onclick",function(){c.noCloneEvent=!1}),t.cloneNode(!0).click());if(c.deleteExpando==null){c.deleteExpando=!0;try{delete t.test}catch(r){c.deleteExpando=!1}}e=t=n=null})(),function(){var t,n,r=N.createElement("div");for(t in{submit:!0,change:!0,focusin:!0})n="on"+t,(c[t+"Bubbles"]=n in e)||(r.setAttribute(n,"t"),c[t+"Bubbles"]=r.attributes[n].expando===!1);r=null}();var Q=/^(?:input|select|textarea)$/i,G=/^key/,Y=/^(?:mouse|contextmenu)|click/,Z=/^(?:focusinfocus|focusoutblur)$/,et=/^([^.]*)(?:\.(.+)|)$/;p.event={global:{},add:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,d,v,m,g=p._data(e);if(!g)return;n.handler&&(a=n,n=a.handler,i=a.selector),n.guid||(n.guid=p.guid++),(o=g.events)||(o=g.events={}),(l=g.handle)||(l=g.handle=function(e){return typeof p===j||!!e&&p.event.triggered===e.type?undefined:p.event.dispatch.apply(l.elem,arguments)},l.elem=e),t=(t||"").match(M)||[""],u=t.length;while(u--){s=et.exec(t[u])||[],d=m=s[1],v=(s[2]||"").split(".").sort();if(!d)continue;f=p.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=p.event.special[d]||{},c=p.extend({type:d,origType:m,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&p.expr.match.needsContext.test(i),namespace:v.join(".")},a);if(!(h=o[d])){h=o[d]=[],h.delegateCount=0;if(!f.setup||f.setup.call(e,r,v,l)===!1)e.addEventListener?e.addEventListener(d,l,!1):e.attachEvent&&e.attachEvent("on"+d,l)}f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?h.splice(h.delegateCount++,0,c):h.push(c),p.event.global[d]=!0}e=null},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,d,v,m,g=p.hasData(e)&&p._data(e);if(!g||!(l=g.events))return;t=(t||"").match(M)||[""],f=t.length;while(f--){u=et.exec(t[f])||[],d=m=u[1],v=(u[2]||"").split(".").sort();if(!d){for(d in l)p.event.remove(e,d+t[f],n,r,!0);continue}c=p.event.special[d]||{},d=(r?c.delegateType:c.bindType)||d,h=l[d]||[],u=u[2]&&new RegExp("(^|\\.)"+v.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=s=h.length;while(s--)o=h[s],(i||m===o.origType)&&(!n||n.guid===o.guid)&&(!u||u.test(o.namespace))&&(!r||r===o.selector||r==="**"&&o.selector)&&(h.splice(s,1),o.selector&&h.delegateCount--,c.remove&&c.remove.call(e,o));a&&!h.length&&((!c.teardown||c.teardown.call(e,v,g.handle)===!1)&&p.removeEvent(e,d,g.handle),delete l[d])}p.isEmptyObject(l)&&(delete g.handle,p._removeData(e,"events"))},trigger:function(t,n,r,i){var s,o,u,a,l,c,h,d=[r||N],v=f.call(t,"type")?t.type:t,m=f.call(t,"namespace")?t.namespace.split("."):[];u=c=r=r||N;if(r.nodeType===3||r.nodeType===8)return;if(Z.test(v+p.event.triggered))return;v.indexOf(".")>=0&&(m=v.split("."),v=m.shift(),m.sort()),o=v.indexOf(":")<0&&"on"+v,t=t[p.expando]?t:new p.Event(v,typeof t=="object"&&t),t.isTrigger=i?2:3,t.namespace=m.join("."),t.namespace_re=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=n==null?[t]:p.makeArray(n,[t]),l=p.event.special[v]||{};if(!i&&l.trigger&&l.trigger.apply(r,n)===!1)return;if(!i&&!l.noBubble&&!p.isWindow(r)){a=l.delegateType||v,Z.test(a+v)||(u=u.parentNode);for(;u;u=u.parentNode)d.push(u),c=u;c===(r.ownerDocument||N)&&d.push(c.defaultView||c.parentWindow||e)}h=0;while((u=d[h++])&&!t.isPropagationStopped())t.type=h>1?a:l.bindType||v,s=(p._data(u,"events")||{})[t.type]&&p._data(u,"handle"),s&&s.apply(u,n),s=o&&u[o],s&&s.apply&&p.acceptData(u)&&(t.result=s.apply(u,n),t.result===!1&&t.preventDefault());t.type=v;if(!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&p.acceptData(r)&&o&&r[v]&&!p.isWindow(r)){c=r[o],c&&(r[o]=null),p.event.triggered=v;try{r[v]()}catch(g){}p.event.triggered=undefined,c&&(r[o]=c)}return t.result},dispatch:function(e){e=p.event.fix(e);var t,n,i,s,o,u=[],a=r.call(arguments),f=(p._data(this,"events")||{})[e.type]||[],l=p.event.special[e.type]||{};a[0]=e,e.delegateTarget=this;if(l.preDispatch&&l.preDispatch.call(this,e)===!1)return;u=p.event.handlers.call(this,e,f),t=0;while((s=u[t++])&&!e.isPropagationStopped()){e.currentTarget=s.elem,o=0;while((i=s.handlers[o++])&&!e.isImmediatePropagationStopped())if(!e.namespace_re||e.namespace_re.test(i.namespace))e.handleObj=i,e.data=i.data,n=((p.event.special[i.origType]||{}).handle||i.handler).apply(s.elem,a),n!==undefined&&(e.result=n)===!1&&(e.preventDefault(),e.stopPropagation())}return l.postDispatch&&l.postDispatch.call(this,e),e.result},handlers:function(e,t){var n,r,i,s,o=[],u=t.delegateCount,a=e.target;if(u&&a.nodeType&&(!e.button||e.type!=="click"))for(;a!=this;a=a.parentNode||this)if(a.nodeType===1&&(a.disabled!==!0||e.type!=="click")){i=[];for(s=0;s<u;s++)r=t[s],n=r.selector+" ",i[n]===undefined&&(i[n]=r.needsContext?p(n,this).index(a)>=0:p.find(n,this,null,[a]).length),i[n]&&i.push(r);i.length&&o.push({elem:a,handlers:i})}return u<t.length&&o.push({elem:this,handlers:t.slice(u)}),o},fix:function(e){if(e[p.expando])return e;var t,n,r,i=e.type,s=e,o=this.fixHooks[i];o||(this.fixHooks[i]=o=Y.test(i)?this.mouseHooks:G.test(i)?this.keyHooks:{}),r=o.props?this.props.concat(o.props):this.props,e=new p.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=s.srcElement||N),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,o.filter?o.filter(e,s):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button,o=t.fromElement;return e.pageX==null&&t.clientX!=null&&(r=e.target.ownerDocument||N,i=r.documentElement,n=r.body,e.pageX=t.clientX+(i&&i.scrollLeft||n&&n.scrollLeft||0)-(i&&i.clientLeft||n&&n.clientLeft||0),e.pageY=t.clientY+(i&&i.scrollTop||n&&n.scrollTop||0)-(i&&i.clientTop||n&&n.clientTop||0)),!e.relatedTarget&&o&&(e.relatedTarget=o===e.target?t.toElement:o),!e.which&&s!==undefined&&(e.which=s&1?1:s&2?3:s&4?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==rt()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){if(this===rt()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if(p.nodeName(this,"input")&&this.type==="checkbox"&&this.click)return this.click(),!1},_default:function(e){return p.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=p.extend(new p.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?p.event.trigger(i,null,t):p.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},p.removeEvent=N.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===j&&(e[r]=null),e.detachEvent(r,n))},p.Event=function(e,t){if(!(this instanceof p.Event))return new p.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.defaultPrevented===undefined&&(e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault())?tt:nt):this.type=e,t&&p.extend(this,t),this.timeStamp=e&&e.timeStamp||p.now(),this[p.expando]=!0},p.Event.prototype={isDefaultPrevented:nt,isPropagationStopped:nt,isImmediatePropagationStopped:nt,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=tt;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=tt;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()}},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){p.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj;if(!i||i!==r&&!p.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),c.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(e){var t=e.target,n=p.nodeName(t,"input")||p.nodeName(t,"button")?t.form:undefined;n&&!p._data(n,"submitBubbles")&&(p.event.add(n,"submit._submit",function(e){e._submit_bubble=!0}),p._data(n,"submitBubbles",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&p.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),c.changeBubbles||(p.event.special.change={setup:function(){if(Q.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,e,!0)});return!1}p.event.add(this,"beforeactivate._change",function(e){var t=e.target;Q.test(t.nodeName)&&!p._data(t,"changeBubbles")&&(p.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&p.event.simulate("change",this.parentNode,e,!0)}),p._data(t,"changeBubbles",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),!Q.test(this.nodeName)}}),c.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){p.event.simulate(t,e.target,p.event.fix(e),!0)};p.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=p._data(r,t);i||r.addEventListener(e,n,!0),p._data(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=p._data(r,t)-1;i?p._data(r,t,i):(r.removeEventListener(e,n,!0),p._removeData(r,t))}}}),p.fn.extend({on:function(e,t,n,r,i){var s,o;if(typeof e=="object"){typeof t!="string"&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}n==null&&r==null?(r=t,n=t=undefined):r==null&&(typeof t=="string"?(r=n,n=undefined):(r=n,n=t,t=undefined));if(r===!1)r=nt;else if(!r)return this;return i===1&&(o=r,r=function(e){return p().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=p.guid++)),this.each(function(){p.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,p(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if(typeof e=="object"){for(i in e)this.off(i,t,e[i]);return this}if(t===!1||typeof t=="function")n=t,t=undefined;return n===!1&&(n=nt),this.each(function(){p.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){p.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return p.event.trigger(e,t,n,!0)}});var st="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ot=/ jQuery\d+="(?:null|\d+)"/g,ut=new RegExp("<(?:"+st+")[\\s/>]","i"),at=/^\s+/,ft=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,lt=/<([\w:]+)/,ct=/<tbody/i,ht=/<|&#?\w+;/,pt=/<(?:script|style|link)/i,dt=/checked\s*(?:[^=]|=\s*.checked.)/i,vt=/^$|\/(?:java|ecma)script/i,mt=/^true\/(.*)/,gt=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,yt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:c.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},bt=it(N),wt=bt.appendChild(N.createElement("div"));yt.optgroup=yt.option,yt.tbody=yt.tfoot=yt.colgroup=yt.caption=yt.thead,yt.th=yt.td,p.extend({clone:function(e,t,n){var r,i,s,o,u,a=p.contains(e.ownerDocument,e);c.html5Clone||p.isXMLDoc(e)||!ut.test("<"+e.nodeName+">")?s=e.cloneNode(!0):(wt.innerHTML=e.outerHTML,wt.removeChild(s=wt.firstChild));if((!c.noCloneEvent||!c.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!p.isXMLDoc(e)){r=Et(s),u=Et(e);for(o=0;(i=u[o])!=null;++o)r[o]&&Lt(i,r[o])}if(t)if(n){u=u||Et(e),r=r||Et(s);for(o=0;(i=u[o])!=null;o++)kt(i,r[o])}else kt(e,s);return r=Et(s,"script"),r.length>0&&Ct(r,!a&&Et(e,"script")),r=u=i=null,s},buildFragment:function(e,t,n,r){var i,s,o,u,a,f,l,h=e.length,d=it(t),v=[],m=0;for(;m<h;m++){s=e[m];if(s||s===0)if(p.type(s)==="object")p.merge(v,s.nodeType?[s]:s);else if(!ht.test(s))v.push(t.createTextNode(s));else{u=u||d.appendChild(t.createElement("div")),a=(lt.exec(s)||["",""])[1].toLowerCase(),l=yt[a]||yt._default,u.innerHTML=l[1]+s.replace(ft,"<$1></$2>")+l[2],i=l[0];while(i--)u=u.lastChild;!c.leadingWhitespace&&at.test(s)&&v.push(t.createTextNode(at.exec(s)[0]));if(!c.tbody){s=a==="table"&&!ct.test(s)?u.firstChild:l[1]==="<table>"&&!ct.test(s)?u:0,i=s&&s.childNodes.length;while(i--)p.nodeName(f=s.childNodes[i],"tbody")&&!f.childNodes.length&&s.removeChild(f)}p.merge(v,u.childNodes),u.textContent="";while(u.firstChild)u.removeChild(u.firstChild);u=d.lastChild}}u&&d.removeChild(u),c.appendChecked||p.grep(Et(v,"input"),St),m=0;while(s=v[m++]){if(r&&p.inArray(s,r)!==-1)continue;o=p.contains(s.ownerDocument,s),u=Et(d.appendChild(s),"script"),o&&Ct(u);if(n){i=0;while(s=u[i++])vt.test(s.type||"")&&n.push(s)}}return u=null,d},cleanData:function(e,t){var r,i,s,o,u=0,a=p.expando,f=p.cache,l=c.deleteExpando,h=p.event.special;for(;(r=e[u])!=null;u++)if(t||p.acceptData(r)){s=r[a],o=s&&f[s];if(o){if(o.events)for(i in o.events)h[i]?p.event.remove(r,i):p.removeEvent(r,i,o.handle);f[s]&&(delete f[s],l?delete r[a]:typeof r.removeAttribute!==j?r.removeAttribute(a):r[a]=null,n.push(s))}}}}),p.fn.extend({text:function(e){return J(this,function(e){return e===undefined?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||N).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var t=xt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var t=xt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?p.filter(e,this):this,i=0;for(;(n=r[i])!=null;i++)!t&&n.nodeType===1&&p.cleanData(Et(n)),n.parentNode&&(t&&p.contains(n.ownerDocument,n)&&Ct(Et(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&p.cleanData(Et(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&p.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return p.clone(this,e,t)})},html:function(e){return J(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined)return t.nodeType===1?t.innerHTML.replace(ot,""):undefined;if(typeof e=="string"&&!pt.test(e)&&(c.htmlSerialize||!ut.test(e))&&(c.leadingWhitespace||!at.test(e))&&!yt[(lt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(ft,"<$1></$2>");try{for(;n<r;n++)t=this[n]||{},t.nodeType===1&&(p.cleanData(Et(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=arguments[0];return this.domManip(arguments,function(t){e=this.parentNode,p.cleanData(Et(this)),e&&e.replaceChild(t,this)}),e&&(e.length||e.nodeType)?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t){e=i.apply([],e);var n,r,s,o,u,a,f=0,l=this.length,h=this,d=l-1,v=e[0],m=p.isFunction(v);if(m||l>1&&typeof v=="string"&&!c.checkClone&&dt.test(v))return this.each(function(n){var r=h.eq(n);m&&(e[0]=v.call(this,n,r.html())),r.domManip(e,t)});if(l){a=p.buildFragment(e,this[0].ownerDocument,!1,this),n=a.firstChild,a.childNodes.length===1&&(a=n);if(n){o=p.map(Et(a,"script"),Tt),s=o.length;for(;f<l;f++)r=a,f!==d&&(r=p.clone(r,!0,!0),s&&p.merge(o,Et(r,"script"))),t.call(this[f],r,f);if(s){u=o[o.length-1].ownerDocument,p.map(o,Nt);for(f=0;f<s;f++)r=o[f],vt.test(r.type||"")&&!p._data(r,"globalEval")&&p.contains(u,r)&&(r.src?p._evalUrl&&p._evalUrl(r.src):p.globalEval((r.text||r.textContent||r.innerHTML||"").replace(gt,"")))}a=n=null}}return this}}),p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){p.fn[e]=function(e){var n,r=0,i=[],o=p(e),u=o.length-1;for(;r<=u;r++)n=r===u?this:this.clone(!0),p(o[r])[t](n),s.apply(i,n.get());return this.pushStack(i)}});var At,Ot={};(function(){var e,t,n=N.createElement("div"),r="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";n.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",e=n.getElementsByTagName("a")[0],e.style.cssText="float:left;opacity:.5",c.opacity=/^0.5/.test(e.style.opacity),c.cssFloat=!!e.style.cssFloat,n.style.backgroundClip="content-box",n.cloneNode(!0).style.backgroundClip="",c.clearCloneStyle=n.style.backgroundClip==="content-box",e=n=null,c.shrinkWrapBlocks=function(){var e,n,i,s;if(t==null){e=N.getElementsByTagName("body")[0];if(!e)return;s="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",n=N.createElement("div"),i=N.createElement("div"),e.appendChild(n).appendChild(i),t=!1,typeof i.style.zoom!==j&&(i.style.cssText=r+";width:1px;padding:1px;zoom:1",i.innerHTML="<div></div>",i.firstChild.style.width="5px",t=i.offsetWidth!==3),e.removeChild(n),e=n=i=null}return t}})();var Dt=/^margin/,Pt=new RegExp("^("+X+")(?!px)[a-z%]+$","i"),Ht,Bt,jt=/^(top|right|bottom|left)$/;e.getComputedStyle?(Ht=function(e){return e.ownerDocument.defaultView.getComputedStyle(e,null)},Bt=function(e,t,n){var r,i,s,o,u=e.style;return n=n||Ht(e),o=n?n.getPropertyValue(t)||n[t]:undefined,n&&(o===""&&!p.contains(e.ownerDocument,e)&&(o=p.style(e,t)),Pt.test(o)&&Dt.test(t)&&(r=u.width,i=u.minWidth,s=u.maxWidth,u.minWidth=u.maxWidth=u.width=o,o=n.width,u.width=r,u.minWidth=i,u.maxWidth=s)),o===undefined?o:o+""}):N.documentElement.currentStyle&&(Ht=function(e){return e.currentStyle},Bt=function(e,t,n){var r,i,s,o,u=e.style;return n=n||Ht(e),o=n?n[t]:undefined,o==null&&u&&u[t]&&(o=u[t]),Pt.test(o)&&!jt.test(t)&&(r=u.left,i=e.runtimeStyle,s=i&&i.left,s&&(i.left=e.currentStyle.left),u.left=t==="fontSize"?"1em":o,o=u.pixelLeft+"px",u.left=r,s&&(i.left=s)),o===undefined?o:o+""||"auto"}),function(){function l(){var t,n,u=N.getElementsByTagName("body")[0];if(!u)return;t=N.createElement("div"),n=N.createElement("div"),t.style.cssText=a,u.appendChild(t).appendChild(n),n.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;display:block;padding:1px;border:1px;width:4px;margin-top:1%;top:1%",p.swap(u,u.style.zoom!=null?{zoom:1}:{},function(){r=n.offsetWidth===4}),i=!0,s=!1,o=!0,e.getComputedStyle&&(s=(e.getComputedStyle(n,null)||{}).top!=="1%",i=(e.getComputedStyle(n,null)||{width:"4px"}).width==="4px"),u.removeChild(t),n=u=null}var t,n,r,i,s,o,u=N.createElement("div"),a="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",f="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";u.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",t=u.getElementsByTagName("a")[0],t.style.cssText="float:left;opacity:.5",c.opacity=/^0.5/.test(t.style.opacity),c.cssFloat=!!t.style.cssFloat,u.style.backgroundClip="content-box",u.cloneNode(!0).style.backgroundClip="",c.clearCloneStyle=u.style.backgroundClip==="content-box",t=u=null,p.extend(c,{reliableHiddenOffsets:function(){if(n!=null)return n;var e,t,r,i=N.createElement("div"),s=N.getElementsByTagName("body")[0];if(!s)return;return i.setAttribute("className","t"),i.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",e=N.createElement("div"),e.style.cssText=a,s.appendChild(e).appendChild(i),i.innerHTML="<table><tr><td></td><td>t</td></tr></table>",t=i.getElementsByTagName("td"),t[0].style.cssText="padding:0;margin:0;border:0;display:none",r=t[0].offsetHeight===0,t[0].style.display="",t[1].style.display="none",n=r&&t[0].offsetHeight===0,s.removeChild(e),i=s=null,n},boxSizing:function(){return r==null&&l(),r},boxSizingReliable:function(){return i==null&&l(),i},pixelPosition:function(){return s==null&&l(),s},reliableMarginRight:function(){var t,n,r,i;if(o==null&&e.getComputedStyle){t=N.getElementsByTagName("body")[0];if(!t)return;n=N.createElement("div"),r=N.createElement("div"),n.style.cssText=a,t.appendChild(n).appendChild(r),i=r.appendChild(N.createElement("div")),i.style.cssText=r.style.cssText=f,i.style.marginRight=i.style.width="0",r.style.width="1px",o=!parseFloat((e.getComputedStyle(i,null)||{}).marginRight),t.removeChild(n)}return o}})}(),p.swap=function(e,t,n,r){var i,s,o={};for(s in t)o[s]=e.style[s],e.style[s]=t[s];i=n.apply(e,r||[]);for(s in t)e.style[s]=o[s];return i};var It=/alpha\([^)]*\)/i,qt=/opacity\s*=\s*([^)]*)/,Rt=/^(none|table(?!-c[ea]).+)/,Ut=new RegExp("^("+X+")(.*)$","i"),zt=new RegExp("^([+-])=("+X+")","i"),Wt={position:"absolute",visibility:"hidden",display:"block"},Xt={letterSpacing:0,fontWeight:400},Vt=["Webkit","O","Moz","ms"];p.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Bt(e,"opacity");return n===""?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":c.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var i,s,o,u=p.camelCase(t),a=e.style;t=p.cssProps[u]||(p.cssProps[u]=$t(a,u)),o=p.cssHooks[t]||p.cssHooks[u];if(n===undefined)return o&&"get"in o&&(i=o.get(e,!1,r))!==undefined?i:a[t];s=typeof n,s==="string"&&(i=zt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(p.css(e,t)),s="number");if(n==null||n!==n)return;s==="number"&&!p.cssNumber[u]&&(n+="px"),!c.clearCloneStyle&&n===""&&t.indexOf("background")===0&&(a[t]="inherit");if(!o||!("set"in o)||(n=o.set(e,n,r))!==undefined)try{a[t]="",a[t]=n}catch(f){}},css:function(e,t,n,r){var i,s,o,u=p.camelCase(t);return t=p.cssProps[u]||(p.cssProps[u]=$t(e.style,u)),o=p.cssHooks[t]||p.cssHooks[u],o&&"get"in o&&(s=o.get(e,!0,n)),s===undefined&&(s=Bt(e,t,r)),s==="normal"&&t in Xt&&(s=Xt[t]),n===""||n?(i=parseFloat(s),n===!0||p.isNumeric(i)?i||0:s):s}}),p.each(["height","width"],function(e,t){p.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&Rt.test(p.css(e,"display"))?p.swap(e,Wt,function(){return Gt(e,t,r)}):Gt(e,t,r)},set:function(e,n,r){var i=r&&Ht(e);return Kt(e,n,r?Qt(e,t,r,c.boxSizing()&&p.css(e,"boxSizing",!1,i)==="border-box",i):0)}}}),c.opacity||(p.cssHooks.opacity={get:function(e,t){return qt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=p.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if((t>=1||t==="")&&p.trim(s.replace(It,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(t===""||r&&!r.filter)return}n.filter=It.test(s)?s.replace(It,i):s+" "+i}}),p.cssHooks.marginRight=Ft(c.reliableMarginRight,function(e,t){if(t)return p.swap(e,{display:"inline-block"},Bt,[e,"marginRight"])}),p.each({margin:"",padding:"",border:"Width"},function(e,t){p.cssHooks[e+t]={expand:function(n){var r=0,i={},s=typeof n=="string"?n.split(" "):[n];for(;r<4;r++)i[e+V[r]+t]=s[r]||s[r-2]||s[0];return i}},Dt.test(e)||(p.cssHooks[e+t].set=Kt)}),p.fn.extend({css:function(e,t){return J(this,function(e,t,n){var r,i,s={},o=0;if(p.isArray(t)){r=Ht(e),i=t.length;for(;o<i;o++)s[t[o]]=p.css(e,t[o],!1,r);return s}return n!==undefined?p.style(e,t,n):p.css(e,t)},e,t,arguments.length>1)},show:function(){return Jt(this,!0)},hide:function(){return Jt(this)},toggle:function(e){return typeof e=="boolean"?e?this.show():this.hide():this.each(function(){$(this)?p(this).show():p(this).hide()})}}),p.Tween=Yt,Yt.prototype={constructor:Yt,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(p.cssNumber[n]?"":"px")},cur:function(){var e=Yt.propHooks[this.prop];return e&&e.get?e.get(this):Yt.propHooks._default.get(this)},run:function(e){var t,n=Yt.propHooks[this.prop];return this.options.duration?this.pos=t=p.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yt.propHooks._default.set(this),this}},Yt.prototype.init.prototype=Yt.prototype,Yt.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=p.css(e.elem,e.prop,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){p.fx.step[e.prop]?p.fx.step[e.prop](e):e.elem.style&&(e.elem.style[p.cssProps[e.prop]]!=null||p.cssHooks[e.prop])?p.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yt.propHooks.scrollTop=Yt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},p.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},p.fx=Yt.prototype.init,p.fx.step={};var Zt,en,tn=/^(?:toggle|show|hide)$/,nn=new RegExp("^(?:([+-])=|)("+X+")([a-z%]*)$","i"),rn=/queueHooks$/,sn=[ln],on={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=nn.exec(t),s=i&&i[3]||(p.cssNumber[e]?"":"px"),o=(p.cssNumber[e]||s!=="px"&&+r)&&nn.exec(p.css(n.elem,e)),u=1,a=20;if(o&&o[3]!==s){s=s||o[3],i=i||[],o=+r||1;do u=u||".5",o/=u,p.style(n.elem,e,o+s);while(u!==(u=n.cur()/r)&&u!==1&&--a)}return i&&(o=n.start=+o||+r||0,n.unit=s,n.end=i[1]?o+(i[1]+1)*i[2]:+i[2]),n}]};p.Animation=p.extend(hn,{tweener:function(e,t){p.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],on[n]=on[n]||[],on[n].unshift(t)},prefilter:function(e,t){t?sn.unshift(e):sn.push(e)}}),p.speed=function(e,t,n){var r=e&&typeof e=="object"?p.extend({},e):{complete:n||!n&&t||p.isFunction(e)&&e,duration:e,easing:n&&t||t&&!p.isFunction(t)&&t};r.duration=p.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in p.fx.speeds?p.fx.speeds[r.duration]:p.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){p.isFunction(r.old)&&r.old.call(this),r.queue&&p.dequeue(this,r.queue)},r},p.fn.extend({fadeTo:function(e,t,n,r){return this.filter($).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=p.isEmptyObject(e),s=p.speed(t,n,r),o=function(){var t=hn(this,p.extend({},e),s);(i||p._data(this,"finish"))&&t.stop(!0)};return o.finish=o,i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return typeof e!="string"&&(n=t,t=e,e=undefined),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=e!=null&&e+"queueHooks",s=p.timers,o=p._data(this);if(i)o[i]&&o[i].stop&&r(o[i]);else for(i in o)o[i]&&o[i].stop&&rn.test(i)&&r(o[i]);for(i=s.length;i--;)s[i].elem===this&&(e==null||s[i].queue===e)&&(s[i].anim.stop(n),t=!1,s.splice(i,1));(t||!n)&&p.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=p._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],s=p.timers,o=r?r.length:0;n.finish=!0,p.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0);for(t=s.length;t--;)s[t].elem===this&&s[t].queue===e&&(s[t].anim.stop(!0),s.splice(t,1));for(t=0;t<o;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),p.each(["toggle","show","hide"],function(e,t){var n=p.fn[t];p.fn[t]=function(e,r,i){return e==null||typeof e=="boolean"?n.apply(this,arguments):this.animate(an(t,!0),e,r,i)}}),p.each({slideDown:an("show"),slideUp:an("hide"),slideToggle:an("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){p.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),p.timers=[],p.fx.tick=function(){var e,t=p.timers,n=0;Zt=p.now();for(;n<t.length;n++)e=t[n],!e()&&t[n]===e&&t.splice(n--,1);t.length||p.fx.stop(),Zt=undefined},p.fx.timer=function(e){p.timers.push(e),e()?p.fx.start():p.timers.pop()},p.fx.interval=13,p.fx.start=function(){en||(en=setInterval(p.fx.tick,p.fx.interval))},p.fx.stop=function(){clearInterval(en),en=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fn.delay=function(e,t){return e=p.fx?p.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},function(){var e,t,n,r,i=N.createElement("div");i.setAttribute("className","t"),i.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",e=i.getElementsByTagName("a")[0],n=N.createElement("select"),r=n.appendChild(N.createElement("option")),t=i.getElementsByTagName("input")[0],e.style.cssText="top:1px",c.getSetAttribute=i.className!=="t",c.style=/top/.test(e.getAttribute("style")),c.hrefNormalized=e.getAttribute("href")==="/a",c.checkOn=!!t.value,c.optSelected=r.selected,c.enctype=!!N.createElement("form").enctype,n.disabled=!0,c.optDisabled=!r.disabled,t=N.createElement("input"),t.setAttribute("value",""),c.input=t.getAttribute("value")==="",t.value="t",t.setAttribute("type","radio"),c.radioValue=t.value==="t",e=t=n=r=i=null}();var pn=/\r/g;p.fn.extend({val:function(e){var t,n,r,i=this[0];if(!arguments.length){if(i)return t=p.valHooks[i.type]||p.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,typeof n=="string"?n.replace(pn,""):n==null?"":n);return}return r=p.isFunction(e),this.each(function(n){var i;if(this.nodeType!==1)return;r?i=e.call(this,n,p(this).val()):i=e,i==null?i="":typeof i=="number"?i+="":p.isArray(i)&&(i=p.map(i,function(e){return e==null?"":e+""})),t=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!t||!("set"in t)||t.set(this,i,"value")===undefined)this.value=i})}}),p.extend({valHooks:{option:{get:function(e){var t=p.find.attr(e,"value");return t!=null?t:p.text(e)}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(c.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!p.nodeName(n.parentNode,"optgroup"))){t=p(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n,r,i=e.options,s=p.makeArray(t),o=i.length;while(o--){r=i[o];if(p.inArray(p.valHooks.option.get(r),s)>=0)try{r.selected=n=!0}catch(u){r.scrollHeight}else r.selected=!1}return n||(e.selectedIndex=-1),i}}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]={set:function(e,t){if(p.isArray(t))return e.checked=p.inArray(p(e).val(),t)>=0}},c.checkOn||(p.valHooks[this].get=function(e){return e.getAttribute("value")===null?"on":e.value})});var dn,vn,mn=p.expr.attrHandle,gn=/^(?:checked|selected)$/i,yn=c.getSetAttribute,bn=c.input;p.fn.extend({attr:function(e,t){return J(this,p.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){p.removeAttr(this,e)})}}),p.extend({attr:function(e,t,n){var r,i,s=e.nodeType;if(!e||s===3||s===8||s===2)return;if(typeof e.getAttribute===j)return p.prop(e,t,n);if(s!==1||!p.isXMLDoc(e))t=t.toLowerCase(),r=p.attrHooks[t]||(p.expr.match.bool.test(t)?vn:dn);if(n===undefined)return r&&"get"in r&&(i=r.get(e,t))!==null?i:(i=p.find.attr(e,t),i==null?undefined:i);if(n!==null)return r&&"set"in r&&(i=r.set(e,n,t))!==undefined?i:(e.setAttribute(t,n+""),n);p.removeAttr(e,t)},removeAttr:function(e,t){var n,r,i=0,s=t&&t.match(M);if(s&&e.nodeType===1)while(n=s[i++])r=p.propFix[n]||n,p.expr.match.bool.test(n)?bn&&yn||!gn.test(n)?e[r]=!1:e[p.camelCase("default-"+n)]=e[r]=!1:p.attr(e,n,""),e.removeAttribute(yn?n:r)},attrHooks:{type:{set:function(e,t){if(!c.radioValue&&t==="radio"&&p.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}}}),vn={set:function(e,t,n){return t===!1?p.removeAttr(e,n):bn&&yn||!gn.test(n)?e.setAttribute(!yn&&p.propFix[n]||n,n):e[p.camelCase("default-"+n)]=e[n]=!0,n}},p.each(p.expr.match.bool.source.match(/\w+/g),function(e,t){var n=mn[t]||p.find.attr;mn[t]=bn&&yn||!gn.test(t)?function(e,t,r){var i,s;return r||(s=mn[t],mn[t]=i,i=n(e,t,r)!=null?t.toLowerCase():null,mn[t]=s),i}:function(e,t,n){if(!n)return e[p.camelCase("default-"+t)]?t.toLowerCase():null}});if(!bn||!yn)p.attrHooks.value={set:function(e,t,n){if(!p.nodeName(e,"input"))return dn&&dn.set(e,t,n);e.defaultValue=t}};yn||(dn={set:function(e,t,n){var r=e.getAttributeNode(n);r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="";if(n==="value"||t===e.getAttribute(n))return t}},mn.id=mn.name=mn.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&r.value!==""?r.value:null},p.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:dn.set},p.attrHooks.contenteditable={set:function(e,t,n){dn.set(e,t===""?!1:t,n)}},p.each(["width","height"],function(e,t){p.attrHooks[t]={set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}}})),c.style||(p.attrHooks.style={get:function(e){return e.style.cssText||undefined},set:function(e,t){return e.style.cssText=t+""}});var wn=/^(?:input|select|textarea|button|object)$/i,En=/^(?:a|area)$/i;p.fn.extend({prop:function(e,t){return J(this,p.prop,e,t,arguments.length>1)},removeProp:function(e){return e=p.propFix[e]||e,this.each(function(){try{this[e]=undefined,delete this[e]}catch(t){}})}}),p.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,s,o=e.nodeType;if(!e||o===3||o===8||o===2)return;return s=o!==1||!p.isXMLDoc(e),s&&(t=p.propFix[t]||t,i=p.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&(r=i.get(e,t))!==null?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=p.find.attr(e,"tabindex");return t?parseInt(t,10):wn.test(e.nodeName)||En.test(e.nodeName)&&e.href?0:-1}}}}),c.hrefNormalized||p.each(["href","src"],function(e,t){p.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),c.optSelected||(p.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),p.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){p.propFix[this.toLowerCase()]=this}),c.enctype||(p.propFix.enctype="encoding");var Sn=/[\t\r\n\f]/g;p.fn.extend({addClass:function(e){var t,n,r,i,s,o,u=0,a=this.length,f=typeof e=="string"&&e;if(p.isFunction(e))return this.each(function(t){p(this).addClass(e.call(this,t,this.className))});if(f){t=(e||"").match(M)||[];for(;u<a;u++){n=this[u],r=n.nodeType===1&&(n.className?(" "+n.className+" ").replace(Sn," "):" ");if(r){s=0;while(i=t[s++])r.indexOf(" "+i+" ")<0&&(r+=i+" ");o=p.trim(r),n.className!==o&&(n.className=o)}}}return this},removeClass:function(e){var t,n,r,i,s,o,u=0,a=this.length,f=arguments.length===0||typeof e=="string"&&e;if(p.isFunction(e))return this.each(function(t){p(this).removeClass(e.call(this,t,this.className))});if(f){t=(e||"").match(M)||[];for(;u<a;u++){n=this[u],r=n.nodeType===1&&(n.className?(" "+n.className+" ").replace(Sn," "):"");if(r){s=0;while(i=t[s++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");o=e?p.trim(r):"",n.className!==o&&(n.className=o)}}}return this},toggleClass:function(e,t){var n=typeof e;return typeof t=="boolean"&&n==="string"?t?this.addClass(e):this.removeClass(e):p.isFunction(e)?this.each(function(n){p(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var t,r=0,i=p(this),s=e.match(M)||[];while(t=s[r++])i.hasClass(t)?i.removeClass(t):i.addClass(t)}else if(n===j||n==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||e===!1?"":p._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(Sn," ").indexOf(t)>=0)return!0;return!1}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){p.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),p.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)}});var xn=p.now(),Tn=/\?/,Nn=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;p.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=p.trim(t+"");return i&&!p.trim(i.replace(Nn,function(e,t,i,s){return n&&t&&(r=0),r===0?e:(n=i||t,r+=!s-!i,"")}))?Function("return "+i)():p.error("Invalid JSON: "+t)},p.parseXML=function(t){var n,r;if(!t||typeof t!="string")return null;try{e.DOMParser?(r=new DOMParser,n=r.parseFromString(t,"text/xml")):(n=new ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=undefined}return(!n||!n.documentElement||n.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+t),n};var Cn,kn,Ln=/#.*$/,An=/([?&])_=[^&]*/,On=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,Mn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,_n=/^(?:GET|HEAD)$/,Dn=/^\/\//,Pn=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hn={},Bn={},jn="*/".concat("*");try{kn=location.href}catch(Fn){kn=N.createElement("a"),kn.href="",kn=kn.href}Cn=Pn.exec(kn.toLowerCase())||[],p.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:kn,type:"GET",isLocal:Mn.test(Cn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":jn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Rn(Rn(e,p.ajaxSettings),t):Rn(p.ajaxSettings,e)},ajaxPrefilter:In(Hn),ajaxTransport:In(Bn),ajax:function(e,t){function x(e,t,n,r){var f,g,y,w,S,x=t;if(b===2)return;b=2,o&&clearTimeout(o),a=undefined,s=r||"",E.readyState=e>0?4:0,f=e>=200&&e<300||e===304,n&&(w=Un(l,E,n)),w=zn(l,w,E,f);if(f)l.ifModified&&(S=E.getResponseHeader("Last-Modified"),S&&(p.lastModified[i]=S),S=E.getResponseHeader("etag"),S&&(p.etag[i]=S)),e===204||l.type==="HEAD"?x="nocontent":e===304?x="notmodified":(x=w.state,g=w.data,y=w.error,f=!y);else{y=x;if(e||!x)x="error",e<0&&(e=0)}E.status=e,E.statusText=(t||x)+"",f?d.resolveWith(c,[g,x,E]):d.rejectWith(c,[E,x,y]),E.statusCode(m),m=undefined,u&&h.trigger(f?"ajaxSuccess":"ajaxError",[E,l,f?g:y]),v.fireWith(c,[E,x]),u&&(h.trigger("ajaxComplete",[E,l]),--p.active||p.event.trigger("ajaxStop"))}typeof e=="object"&&(t=e,e=undefined),t=t||{};var n,r,i,s,o,u,a,f,l=p.ajaxSetup({},t),c=l.context||l,h=l.context&&(c.nodeType||c.jquery)?p(c):p.event,d=p.Deferred(),v=p.Callbacks("once memory"),m=l.statusCode||{},g={},y={},b=0,w="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(b===2){if(!f){f={};while(t=On.exec(s))f[t[1].toLowerCase()]=t[2]}t=f[e.toLowerCase()]}return t==null?null:t},getAllResponseHeaders:function(){return b===2?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=y[n]=y[n]||e,g[e]=t),this},overrideMimeType:function(e){return b||(l.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)m[t]=[m[t],e[t]];else E.always(e[E.status]);return this},abort:function(e){var t=e||w;return a&&a.abort(t),x(0,t),this}};d.promise(E).complete=v.add,E.success=E.done,E.error=E.fail,l.url=((e||l.url||kn)+"").replace(Ln,"").replace(Dn,Cn[1]+"//"),l.type=t.method||t.type||l.method||l.type,l.dataTypes=p.trim(l.dataType||"*").toLowerCase().match(M)||[""],l.crossDomain==null&&(n=Pn.exec(l.url.toLowerCase()),l.crossDomain=!(!n||n[1]===Cn[1]&&n[2]===Cn[2]&&(n[3]||(n[1]==="http:"?"80":"443"))===(Cn[3]||(Cn[1]==="http:"?"80":"443")))),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),qn(Hn,l,t,E);if(b===2)return E;u=l.global,u&&p.active++===0&&p.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!_n.test(l.type),i=l.url,l.hasContent||(l.data&&(i=l.url+=(Tn.test(i)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=An.test(i)?i.replace(An,"$1_="+xn++):i+(Tn.test(i)?"&":"?")+"_="+xn++)),l.ifModified&&(p.lastModified[i]&&E.setRequestHeader("If-Modified-Since",p.lastModified[i]),p.etag[i]&&E.setRequestHeader("If-None-Match",p.etag[i])),(l.data&&l.hasContent&&l.contentType!==!1||t.contentType)&&E.setRequestHeader("Content-Type",l.contentType),E.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+jn+"; q=0.01":""):l.accepts["*"]);for(r in l.headers)E.setRequestHeader(r,l.headers[r]);if(!l.beforeSend||l.beforeSend.call(c,E,l)!==!1&&b!==2){w="abort";for(r in{success:1,error:1,complete:1})E[r](l[r]);a=qn(Bn,l,t,E);if(!a)x(-1,"No Transport");else{E.readyState=1,u&&h.trigger("ajaxSend",[E,l]),l.async&&l.timeout>0&&(o=setTimeout(function(){E.abort("timeout")},l.timeout));try{b=1,a.send(g,x)}catch(S){if(!(b<2))throw S;x(-1,S)}}return E}return E.abort()},getJSON:function(e,t,n){return p.get(e,t,n,"json")},getScript:function(e,t){return p.get(e,undefined,t,"script")}}),p.each(["get","post"],function(e,t){p[t]=function(e,n,r,i){return p.isFunction(n)&&(i=i||r,r=n,n=undefined),p.ajax({url:e,type:t,dataType:i,data:n,success:r})}}),p.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){p.fn[t]=function(e){return this.on(t,e)}}),p._evalUrl=function(e){return p.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},p.fn.extend({wrapAll:function(e){if(p.isFunction(e))return this.each(function(t){p(this).wrapAll(e.call(this,t))});if(this[0]){var t=p(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return p.isFunction(e)?this.each(function(t){p(this).wrapInner(e.call(this,t))}):this.each(function(){var t=p(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=p.isFunction(e);return this.each(function(n){p(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()}}),p.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0||!c.reliableHiddenOffsets()&&(e.style&&e.style.display||p.css(e,"display"))==="none"},p.expr.filters.visible=function(e){return!p.expr.filters.hidden(e)};var Wn=/%20/g,Xn=/\[\]$/,Vn=/\r?\n/g,$n=/^(?:submit|button|image|reset|file)$/i,Jn=/^(?:input|select|textarea|keygen)/i;p.param=function(e,t){var n,r=[],i=function(e,t){t=p.isFunction(t)?t():t==null?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};t===undefined&&(t=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(e)||e.jquery&&!p.isPlainObject(e))p.each(e,function(){i(this.name,this.value)});else for(n in e)Kn(n,e[n],t,i);return r.join("&").replace(Wn,"+")},p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=p.prop(this,"elements");return e?p.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!p(this).is(":disabled")&&Jn.test(this.nodeName)&&!$n.test(e)&&(this.checked||!K.test(e))}).map(function(e,t){var n=p(this).val();return n==null?null:p.isArray(n)?p.map(n,function(e){return{name:t.name,value:e.replace(Vn,"\r\n")}}):{name:t.name,value:n.replace(Vn,"\r\n")}}).get()}}),p.ajaxSettings.xhr=e.ActiveXObject!==undefined?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zn()||er()}:Zn;var Qn=0,Gn={},Yn=p.ajaxSettings.xhr();e.ActiveXObject&&p(e).on("unload",function(){for(var e in Gn)Gn[e](undefined,!0)}),c.cors=!!Yn&&"withCredentials"in Yn,Yn=c.ajax=!!Yn,Yn&&p.ajaxTransport(function(e){if(!e.crossDomain||c.cors){var t;return{send:function(n,r){var i,s=e.xhr(),o=++Qn;s.open(e.type,e.url,e.async,e.username,e.password);if(e.xhrFields)for(i in e.xhrFields)s[i]=e.xhrFields[i];e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),!e.crossDomain&&!n["X-Requested-With"]&&(n["X-Requested-With"]="XMLHttpRequest");for(i in n)n[i]!==undefined&&s.setRequestHeader(i,n[i]+"");s.send(e.hasContent&&e.data||null),t=function(n,i){var u,a,f;if(t&&(i||s.readyState===4)){delete Gn[o],t=undefined,s.onreadystatechange=p.noop;if(i)s.readyState!==4&&s.abort();else{f={},u=s.status,typeof s.responseText=="string"&&(f.text=s.responseText);try{a=s.statusText}catch(l){a=""}!u&&e.isLocal&&!e.crossDomain?u=f.text?200:404:u===1223&&(u=204)}}f&&r(u,a,f,s.getAllResponseHeaders())},e.async?s.readyState===4?setTimeout(t):s.onreadystatechange=Gn[o]=t:t()},abort:function(){t&&t(undefined,!0)}}}}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return p.globalEval(e),e}}}),p.ajaxPrefilter("script",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),p.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=N.head||p("head")[0]||N.documentElement;return{send:function(r,i){t=N.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){if(n||!t.readyState||/loaded|complete/.test(t.readyState))t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success")},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(undefined,!0)}}}});var tr=[],nr=/(=)\?(?=&|$)|\?\?/;p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=tr.pop()||p.expando+"_"+xn++;return this[e]=!0,e}}),p.ajaxPrefilter("json jsonp",function(t,n,r){var i,s,o,u=t.jsonp!==!1&&(nr.test(t.url)?"url":typeof t.data=="string"&&!(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&nr.test(t.data)&&"data");if(u||t.dataTypes[0]==="jsonp")return i=t.jsonpCallback=p.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,u?t[u]=t[u].replace(nr,"$1"+i):t.jsonp!==!1&&(t.url+=(Tn.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return o||p.error(i+" was not called"),o[0]},t.dataTypes[0]="json",s=e[i],e[i]=function(){o=arguments},r.always(function(){e[i]=s,t[i]&&(t.jsonpCallback=n.jsonpCallback,tr.push(i)),o&&p.isFunction(s)&&s(o[0]),o=s=undefined}),"script"}),p.parseHTML=function(e,t,n){if(!e||typeof e!="string")return null;typeof t=="boolean"&&(n=t,t=!1),t=t||N;var r=E.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=p.buildFragment([e],t,i),i&&i.length&&p(i).remove(),p.merge([],r.childNodes))};var rr=p.fn.load;p.fn.load=function(e,t,n){if(typeof e!="string"&&rr)return rr.apply(this,arguments);var r,i,s,o=this,u=e.indexOf(" ");return u>=0&&(r=e.slice(u,e.length),e=e.slice(0,u)),p.isFunction(t)?(n=t,t=undefined):t&&typeof t=="object"&&(s="POST"),o.length>0&&p.ajax({url:e,type:s,dataType:"html",data:t}).done(function(e){i=arguments,o.html(r?p("<div>").append(p.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){o.each(n,i||[e.responseText,t,e])}),this},p.expr.filters.animated=function(e){return p.grep(p.timers,function(t){return e===t.elem}).length};var ir=e.document.documentElement;p.offset={setOffset:function(e,t,n){var r,i,s,o,u,a,f,l=p.css(e,"position"),c=p(e),h={};l==="static"&&(e.style.position="relative"),u=c.offset(),s=p.css(e,"top"),a=p.css(e,"left"),f=(l==="absolute"||l==="fixed")&&p.inArray("auto",[s,a])>-1,f?(r=c.position(),o=r.top,i=r.left):(o=parseFloat(s)||0,i=parseFloat(a)||0),p.isFunction(t)&&(t=t.call(e,n,u)),t.top!=null&&(h.top=t.top-u.top+o),t.left!=null&&(h.left=t.left-u.left+i),"using"in t?t.using.call(e,h):c.css(h)}},p.fn.extend({offset:function(e){if(arguments.length)return e===undefined?this:this.each(function(t){p.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],s=i&&i.ownerDocument;if(!s)return;return t=s.documentElement,p.contains(t,i)?(typeof i.getBoundingClientRect!==j&&(r=i.getBoundingClientRect()),n=sr(s),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(!this[0])return;var e,t,n={top:0,left:0},r=this[0];return p.css(r,"position")==="fixed"?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),p.nodeName(e[0],"html")||(n=e.offset()),n.top+=p.css(e[0],"borderTopWidth",!0),n.left+=p.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-p.css(r,"marginTop",!0),left:t.left-n.left-p.css(r,"marginLeft",!0)}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||ir;while(e&&!p.nodeName(e,"html")&&p.css(e,"position")==="static")e=e.offsetParent;return e||ir})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);p.fn[e]=function(r){return J(this,function(e,r,i){var s=sr(e);if(i===undefined)return s?t in s?s[t]:s.document.documentElement[r]:e[r];s?s.scrollTo(n?p(s).scrollLeft():i,n?i:p(s).scrollTop()):e[r]=i},e,r,arguments.length,null)}}),p.each(["top","left"],function(e,t){p.cssHooks[t]=Ft(c.pixelPosition,function(e,n){if(n)return n=Bt(e,t),Pt.test(n)?p(e).position()[t]+"px":n})}),p.each({Height:"height",Width:"width"},function(e,t){p.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){p.fn[r]=function(r,i){var s=arguments.length&&(n||typeof r!="boolean"),o=n||(r===!0||i===!0?"margin":"border");return J(this,function(t,n,r){var i;return p.isWindow(t)?t.document.documentElement["client"+e]:t.nodeType===9?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):r===undefined?p.css(t,n,o):p.style(t,n,r,o)},t,s?r:undefined,s,null)}})}),p.fn.size=function(){return this.length},p.fn.andSelf=p.fn.addBack,typeof define=="function"&&define.amd&&define("jquery",[],function(){return p});var or=e.jQuery,ur=e.$;return p.noConflict=function(t){return e.$===p&&(e.$=ur),t&&e.jQuery===p&&(e.jQuery=or),p},typeof t===j&&(e.jQuery=e.$=p),p}),define("jquery-private",["jquery"],function(e){return e.noConflict(!0)}),function(){function x(e){function t(t,n,r,i,s,o){for(;s>=0&&s<o;s+=e){var u=i?i[s]:s;r=n(r,t[u],u,t)}return r}return function(n,r,i,s){r=v(r,s,4);var o=!S(n)&&d.keys(n),u=(o||n).length,a=e>0?0:u-1;return arguments.length<3&&(i=n[o?o[a]:a],a+=e),t(n,r,i,o,a,u)}}function C(e){return function(t,n,r){n=m(n,r);var i=E(t),s=e>0?0:i-1;for(;s>=0&&s<i;s+=e)if(n(t[s],s,t))return s;return-1}}function k(e,t,n){return function(r,i,s){var u=0,a=E(r);if(typeof s=="number")e>0?u=s>=0?s:Math.max(s+a,u):a=s>=0?Math.min(s+1,a):s+a+1;else if(n&&s&&a)return s=n(r,i),r[s]===i?s:-1;if(i!==i)return s=t(o.call(r,u,a),d.isNaN),s>=0?s+u:-1;for(s=e>0?u:a-1;s>=0&&s<a;s+=e)if(r[s]===i)return s;return-1}}function M(e,t){var n=O.length,i=e.constructor,s=d.isFunction(i)&&i.prototype||r,o="constructor";d.has(e,o)&&!d.contains(t,o)&&t.push(o);while(n--)o=O[n],o in e&&e[o]!==s[o]&&!d.contains(t,o)&&t.push(o)}var e=this,t=e._,n=Array.prototype,r=Object.prototype,i=Function.prototype,s=n.push,o=n.slice,u=r.toString,a=r.hasOwnProperty,f=Array.isArray,l=Object.keys,c=i.bind,h=Object.create,p=function(){},d=function(e){if(e instanceof d)return e;if(!(this instanceof d))return new d(e);this._wrapped=e};typeof exports!="undefined"?(typeof module!="undefined"&&module.exports&&(exports=module.exports=d),exports._=d):e._=d,d.VERSION="1.8.3";var v=function(e,t,n){if(t===void 0)return e;switch(n==null?3:n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)};case 4:return function(n,r,i,s){return e.call(t,n,r,i,s)}}return function(){return e.apply(t,arguments)}},m=function(e,t,n){return e==null?d.identity:d.isFunction(e)?v(e,t,n):d.isObject(e)?d.matcher(e):d.property(e)};d.iteratee=function(e,t){return m(e,t,Infinity)};var g=function(e,t){return function(n){var r=arguments.length;if(r<2||n==null)return n;for(var i=1;i<r;i++){var s=arguments[i],o=e(s),u=o.length;for(var a=0;a<u;a++){var f=o[a];if(!t||n[f]===void 0)n[f]=s[f]}}return n}},y=function(e){if(!d.isObject(e))return{};if(h)return h(e);p.prototype=e;var t=new p;return p.prototype=null,t},b=function(e){return function(t){return t==null?void 0:t[e]}},w=Math.pow(2,53)-1,E=b("length"),S=function(e){var t=E(e);return typeof t=="number"&&t>=0&&t<=w};d.each=d.forEach=function(e,t,n){t=v(t,n);var r,i;if(S(e))for(r=0,i=e.length;r<i;r++)t(e[r],r,e);else{var s=d.keys(e);for(r=0,i=s.length;r<i;r++)t(e[s[r]],s[r],e)}return e},d.map=d.collect=function(e,t,n){t=m(t,n);var r=!S(e)&&d.keys(e),i=(r||e).length,s=Array(i);for(var o=0;o<i;o++){var u=r?r[o]:o;s[o]=t(e[u],u,e)}return s},d.reduce=d.foldl=d.inject=x(1),d.reduceRight=d.foldr=x(-1),d.find=d.detect=function(e,t,n){var r;S(e)?r=d.findIndex(e,t,n):r=d.findKey(e,t,n);if(r!==void 0&&r!==-1)return e[r]},d.filter=d.select=function(e,t,n){var r=[];return t=m(t,n),d.each(e,function(e,n,i){t(e,n,i)&&r.push(e)}),r},d.reject=function(e,t,n){return d.filter(e,d.negate(m(t)),n)},d.every=d.all=function(e,t,n){t=m(t,n);var r=!S(e)&&d.keys(e),i=(r||e).length;for(var s=0;s<i;s++){var o=r?r[s]:s;if(!t(e[o],o,e))return!1}return!0},d.some=d.any=function(e,t,n){t=m(t,n);var r=!S(e)&&d.keys(e),i=(r||e).length;for(var s=0;s<i;s++){var o=r?r[s]:s;if(t(e[o],o,e))return!0}return!1},d.contains=d.includes=d.include=function(e,t,n,r){S(e)||(e=d.values(e));if(typeof n!="number"||r)n=0;return d.indexOf(e,t,n)>=0},d.invoke=function(e,t){var n=o.call(arguments,2),r=d.isFunction(t);return d.map(e,function(e){var i=r?t:e[t];return i==null?i:i.apply(e,n)})},d.pluck=function(e,t){return d.map(e,d.property(t))},d.where=function(e,t){return d.filter(e,d.matcher(t))},d.findWhere=function(e,t){return d.find(e,d.matcher(t))},d.max=function(e,t,n){var r=-Infinity,i=-Infinity,s,o;if(t==null&&e!=null){e=S(e)?e:d.values(e);for(var u=0,a=e.length;u<a;u++)s=e[u],s>r&&(r=s)}else t=m(t,n),d.each(e,function(e,n,s){o=t(e,n,s);if(o>i||o===-Infinity&&r===-Infinity)r=e,i=o});return r},d.min=function(e,t,n){var r=Infinity,i=Infinity,s,o;if(t==null&&e!=null){e=S(e)?e:d.values(e);for(var u=0,a=e.length;u<a;u++)s=e[u],s<r&&(r=s)}else t=m(t,n),d.each(e,function(e,n,s){o=t(e,n,s);if(o<i||o===Infinity&&r===Infinity)r=e,i=o});return r},d.shuffle=function(e){var t=S(e)?e:d.values(e),n=t.length,r=Array(n);for(var i=0,s;i<n;i++)s=d.random(0,i),s!==i&&(r[i]=r[s]),r[s]=t[i];return r},d.sample=function(e,t,n){return t==null||n?(S(e)||(e=d.values(e)),e[d.random(e.length-1)]):d.shuffle(e).slice(0,Math.max(0,t))},d.sortBy=function(e,t,n){return t=m(t,n),d.pluck(d.map(e,function(e,n,r){return{value:e,index:n,criteria:t(e,n,r)}}).sort(function(e,t){var n=e.criteria,r=t.criteria;if(n!==r){if(n>r||n===void 0)return 1;if(n<r||r===void 0)return-1}return e.index-t.index}),"value")};var T=function(e){return function(t,n,r){var i={};return n=m(n,r),d.each(t,function(r,s){var o=n(r,s,t);e(i,r,o)}),i}};d.groupBy=T(function(e,t,n){d.has(e,n)?e[n].push(t):e[n]=[t]}),d.indexBy=T(function(e,t,n){e[n]=t}),d.countBy=T(function(e,t,n){d.has(e,n)?e[n]++:e[n]=1}),d.toArray=function(e){return e?d.isArray(e)?o.call(e):S(e)?d.map(e,d.identity):d.values(e):[]},d.size=function(e){return e==null?0:S(e)?e.length:d.keys(e).length},d.partition=function(e,t,n){t=m(t,n);var r=[],i=[];return d.each(e,function(e,n,s){(t(e,n,s)?r:i).push(e)}),[r,i]},d.first=d.head=d.take=function(e,t,n){return e==null?void 0:t==null||n?e[0]:d.initial(e,e.length-t)},d.initial=function(e,t,n){return o.call(e,0,Math.max(0,e.length-(t==null||n?1:t)))},d.last=function(e,t,n){return e==null?void 0:t==null||n?e[e.length-1]:d.rest(e,Math.max(0,e.length-t))},d.rest=d.tail=d.drop=function(e,t,n){return o.call(e,t==null||n?1:t)},d.compact=function(e){return d.filter(e,d.identity)};var N=function(e,t,n,r){var i=[],s=0;for(var o=r||0,u=E(e);o<u;o++){var a=e[o];if(S(a)&&(d.isArray(a)||d.isArguments(a))){t||(a=N(a,t,n));var f=0,l=a.length;i.length+=l;while(f<l)i[s++]=a[f++]}else n||(i[s++]=a)}return i};d.flatten=function(e,t){return N(e,t,!1)},d.without=function(e){return d.difference(e,o.call(arguments,1))},d.uniq=d.unique=function(e,t,n,r){d.isBoolean(t)||(r=n,n=t,t=!1),n!=null&&(n=m(n,r));var i=[],s=[];for(var o=0,u=E(e);o<u;o++){var a=e[o],f=n?n(a,o,e):a;t?((!o||s!==f)&&i.push(a),s=f):n?d.contains(s,f)||(s.push(f),i.push(a)):d.contains(i,a)||i.push(a)}return i},d.union=function(){return d.uniq(N(arguments,!0,!0))},d.intersection=function(e){var t=[],n=arguments.length;for(var r=0,i=E(e);r<i;r++){var s=e[r];if(d.contains(t,s))continue;for(var o=1;o<n;o++)if(!d.contains(arguments[o],s))break;o===n&&t.push(s)}return t},d.difference=function(e){var t=N(arguments,!0,!0,1);return d.filter(e,function(e){return!d.contains(t,e)})},d.zip=function(){return d.unzip(arguments)},d.unzip=function(e){var t=e&&d.max(e,E).length||0,n=Array(t);for(var r=0;r<t;r++)n[r]=d.pluck(e,r);return n},d.object=function(e,t){var n={};for(var r=0,i=E(e);r<i;r++)t?n[e[r]]=t[r]:n[e[r][0]]=e[r][1];return n},d.findIndex=C(1),d.findLastIndex=C(-1),d.sortedIndex=function(e,t,n,r){n=m(n,r,1);var i=n(t),s=0,o=E(e);while(s<o){var u=Math.floor((s+o)/2);n(e[u])<i?s=u+1:o=u}return s},d.indexOf=k(1,d.findIndex,d.sortedIndex),d.lastIndexOf=k(-1,d.findLastIndex),d.range=function(e,t,n){t==null&&(t=e||0,e=0),n=n||1;var r=Math.max(Math.ceil((t-e)/n),0),i=Array(r);for(var s=0;s<r;s++,e+=n)i[s]=e;return i};var L=function(e,t,n,r,i){if(r instanceof t){var s=y(e.prototype),o=e.apply(s,i);return d.isObject(o)?o:s}return e.apply(n,i)};d.bind=function(e,t){if(c&&e.bind===c)return c.apply(e,o.call(arguments,1));if(!d.isFunction(e))throw new TypeError("Bind must be called on a function");var n=o.call(arguments,2),r=function(){return L(e,r,t,this,n.concat(o.call(arguments)))};return r},d.partial=function(e){var t=o.call(arguments,1),n=function(){var r=0,i=t.length,s=Array(i);for(var o=0;o<i;o++)s[o]=t[o]===d?arguments[r++]:t[o];while(r<arguments.length)s.push(arguments[r++]);return L(e,n,this,this,s)};return n},d.bindAll=function(e){var t,n=arguments.length,r;if(n<=1)throw new Error("bindAll must be passed function names");for(t=1;t<n;t++)r=arguments[t],e[r]=d.bind(e[r],e);return e},d.memoize=function(e,t){var n=function(r){var i=n.cache,s=""+(t?t.apply(this,arguments):r);return d.has(i,s)||(i[s]=e.apply(this,arguments)),i[s]};return n.cache={},n},d.delay=function(e,t){var n=o.call(arguments,2);return setTimeout(function(){return e.apply(null,n)},t)},d.defer=d.partial(d.delay,d,1),d.throttle=function(e,t,n){var r,i,s,o=null,u=0;n||(n={});var a=function(){u=n.leading===!1?0:d.now(),o=null,s=e.apply(r,i),o||(r=i=null)};return function(){var f=d.now();!u&&n.leading===!1&&(u=f);var l=t-(f-u);return r=this,i=arguments,l<=0||l>t?(o&&(clearTimeout(o),o=null),u=f,s=e.apply(r,i),o||(r=i=null)):!o&&n.trailing!==!1&&(o=setTimeout(a,l)),s}},d.debounce=function(e,t,n){var r,i,s,o,u,a=function(){var f=d.now()-o;f<t&&f>=0?r=setTimeout(a,t-f):(r=null,n||(u=e.apply(s,i),r||(s=i=null)))};return function(){s=this,i=arguments,o=d.now();var f=n&&!r;return r||(r=setTimeout(a,t)),f&&(u=e.apply(s,i),s=i=null),u}},d.wrap=function(e,t){return d.partial(t,e)},d.negate=function(e){return function(){return!e.apply(this,arguments)}},d.compose=function(){var e=arguments,t=e.length-1;return function(){var n=t,r=e[t].apply(this,arguments);while(n--)r=e[n].call(this,r);return r}},d.after=function(e,t){return function(){if(--e<1)return t.apply(this,arguments)}},d.before=function(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}},d.once=d.partial(d.before,2);var A=!{toString:null}.propertyIsEnumerable("toString"),O=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];d.keys=function(e){if(!d.isObject(e))return[];if(l)return l(e);var t=[];for(var n in e)d.has(e,n)&&t.push(n);return A&&M(e,t),t},d.allKeys=function(e){if(!d.isObject(e))return[];var t=[];for(var n in e)t.push(n);return A&&M(e,t),t},d.values=function(e){var t=d.keys(e),n=t.length,r=Array(n);for(var i=0;i<n;i++)r[i]=e[t[i]];return r},d.mapObject=function(e,t,n){t=m(t,n);var r=d.keys(e),i=r.length,s={},o;for(var u=0;u<i;u++)o=r[u],s[o]=t(e[o],o,e);return s},d.pairs=function(e){var t=d.keys(e),n=t.length,r=Array(n);for(var i=0;i<n;i++)r[i]=[t[i],e[t[i]]];return r},d.invert=function(e){var t={},n=d.keys(e);for(var r=0,i=n.length;r<i;r++)t[e[n[r]]]=n[r];return t},d.functions=d.methods=function(e){var t=[];for(var n in e)d.isFunction(e[n])&&t.push(n);return t.sort()},d.extend=g(d.allKeys),d.extendOwn=d.assign=g(d.keys),d.findKey=function(e,t,n){t=m(t,n);var r=d.keys(e),i;for(var s=0,o=r.length;s<o;s++){i=r[s];if(t(e[i],i,e))return i}},d.pick=function(e,t,n){var r={},i=e,s,o;if(i==null)return r;d.isFunction(t)?(o=d.allKeys(i),s=v(t,n)):(o=N(arguments,!1,!1,1),s=function(e,t,n){return t in n},i=Object(i));for(var u=0,a=o.length;u<a;u++){var f=o[u],l=i[f];s(l,f,i)&&(r[f]=l)}return r},d.omit=function(e,t,n){if(d.isFunction(t))t=d.negate(t);else{var r=d.map(N(arguments,!1,!1,1),String);t=function(e,t){return!d.contains(r,t)}}return d.pick(e,t,n)},d.defaults=g(d.allKeys,!0),d.create=function(e,t){var n=y(e);return t&&d.extendOwn(n,t),n},d.clone=function(e){return d.isObject(e)?d.isArray(e)?e.slice():d.extend({},e):e},d.tap=function(e,t){return t(e),e},d.isMatch=function(e,t){var n=d.keys(t),r=n.length;if(e==null)return!r;var i=Object(e);for(var s=0;s<r;s++){var o=n[s];if(t[o]!==i[o]||!(o in i))return!1}return!0};var _=function(e,t,n,r){if(e===t)return e!==0||1/e===1/t;if(e==null||t==null)return e===t;e instanceof d&&(e=e._wrapped),t instanceof d&&(t=t._wrapped);var i=u.call(e);if(i!==u.call(t))return!1;switch(i){case"[object RegExp]":case"[object String]":return""+e==""+t;case"[object Number]":if(+e!==+e)return+t!==+t;return+e===0?1/+e===1/t:+e===+t;case"[object Date]":case"[object Boolean]":return+e===+t}var s=i==="[object Array]";if(!s){if(typeof e!="object"||typeof t!="object")return!1;var o=e.constructor,a=t.constructor;if(o!==a&&!(d.isFunction(o)&&o instanceof o&&d.isFunction(a)&&a instanceof a)&&"constructor"in e&&"constructor"in t)return!1}n=n||[],r=r||[];var f=n.length;while(f--)if(n[f]===e)return r[f]===t;n.push(e),r.push(t);if(s){f=e.length;if(f!==t.length)return!1;while(f--)if(!_(e[f],t[f],n,r))return!1}else{var l=d.keys(e),c;f=l.length;if(d.keys(t).length!==f)return!1;while(f--){c=l[f];if(!d.has(t,c)||!_(e[c],t[c],n,r))return!1}}return n.pop(),r.pop(),!0};d.isEqual=function(e,t){return _(e,t)},d.isEmpty=function(e){return e==null?!0:S(e)&&(d.isArray(e)||d.isString(e)||d.isArguments(e))?e.length===0:d.keys(e).length===0},d.isElement=function(e){return!!e&&e.nodeType===1},d.isArray=f||function(e){return u.call(e)==="[object Array]"},d.isObject=function(e){var t=typeof e;return t==="function"||t==="object"&&!!e},d.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(e){d["is"+e]=function(t){return u.call(t)==="[object "+e+"]"}}),d.isArguments(arguments)||(d.isArguments=function(e){return d.has(e,"callee")}),typeof /./!="function"&&typeof Int8Array!="object"&&(d.isFunction=function(e){return typeof e=="function"||!1}),d.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},d.isNaN=function(e){return d.isNumber(e)&&e!==+e},d.isBoolean=function(e){return e===!0||e===!1||u.call(e)==="[object Boolean]"},d.isNull=function(e){return e===null},d.isUndefined=function(e){return e===void 0},d.has=function(e,t){return e!=null&&a.call(e,t)},d.noConflict=function(){return e._=t,this},d.identity=function(e){return e},d.constant=function(e){return function(){return e}},d.noop=function(){},d.property=b,d.propertyOf=function(e){return e==null?function(){}:function(t){return e[t]}},d.matcher=d.matches=function(e){return e=d.extendOwn({},e),function(t){return d.isMatch(t,e)}},d.times=function(e,t,n){var r=Array(Math.max(0,e));t=v(t,n,1);for(var i=0;i<e;i++)r[i]=t(i);return r},d.random=function(e,t){return t==null&&(t=e,e=0),e+Math.floor(Math.random()*(t-e+1))},d.now=Date.now||function(){return(new Date).getTime()};var D={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},P=d.invert(D),H=function(e){var t=function(t){return e[t]},n="(?:"+d.keys(e).join("|")+")",r=RegExp(n),i=RegExp(n,"g");return function(e){return e=e==null?"":""+e,r.test(e)?e.replace(i,t):e}};d.escape=H(D),d.unescape=H(P),d.result=function(e,t,n){var r=e==null?void 0:e[t];return r===void 0&&(r=n),d.isFunction(r)?r.call(e):r};var B=0;d.uniqueId=function(e){var t=++B+"";return e?e+t:t},d.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var j=/(.)^/,F={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},I=/\\|'|\r|\n|\u2028|\u2029/g,q=function(e){return"\\"+F[e]};d.template=function(e,t,n){!t&&n&&(t=n),t=d.defaults({},t,d.templateSettings);var r=RegExp([(t.escape||j).source,(t.interpolate||j).source,(t.evaluate||j).source].join("|")+"|$","g"),i=0,s="__p+='";e.replace(r,function(t,n,r,o,u){return s+=e.slice(i,u).replace(I,q),i=u+t.length,n?s+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'":r?s+="'+\n((__t=("+r+"))==null?'':__t)+\n'":o&&(s+="';\n"+o+"\n__p+='"),t}),s+="';\n",t.variable||(s="with(obj||{}){\n"+s+"}\n"),s="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+s+"return __p;\n";try{var o=new Function(t.variable||"obj","_",s)}catch(u){throw u.source=s,u}var a=function(e){return o.call(this,e,d)},f=t.variable||"obj";return a.source="function("+f+"){\n"+s+"}",a},d.chain=function(e){var t=d(e);return t._chain=!0,t};var R=function(e,t){return e._chain?d(t).chain():t};d.mixin=function(e){d.each(d.functions(e),function(t){var n=d[t]=e[t];d.prototype[t]=function(){var e=[this._wrapped];return s.apply(e,arguments),R(this,n.apply(d,e))}})},d.mixin(d),d.each(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=n[e];d.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e==="shift"||e==="splice")&&n.length===0&&delete n[0],R(this,n)}}),d.each(["concat","join","slice"],function(e){var t=n[e];d.prototype[e]=function(){return R(this,t.apply(this._wrapped,arguments))}}),d.prototype.value=function(){return this._wrapped},d.prototype.valueOf=d.prototype.toJSON=d.prototype.value,d.prototype.toString=function(){return""+this._wrapped},typeof define=="function"&&define.amd&&define("underscore",[],function(){return d})}.call(this),String.prototype.endsWith||(String.prototype.endsWith=function(e,t){var n=this.toString();if(t===undefined||t>n.length)t=n.length;t-=e.length;var r=n.indexOf(e,t);return r!==-1&&r===t}),String.prototype.splitOnce=function(e){var t=this.split(e);return[t.shift(),t.join(e)]},String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),define("polyfill",function(){}),define("text",["module"],function(e){"use strict";var t,n,r,i,s,o=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],u=/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,a=/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im,f=typeof location!="undefined"&&location.href,l=f&&location.protocol&&location.protocol.replace(/\:/,""),c=f&&location.hostname,h=f&&(location.port||undefined),p={},d=e.config&&e.config()||{};t={version:"2.0.14",strip:function(e){if(e){e=e.replace(u,"");var t=e.match(a);t&&(e=t[1])}else e="";return e},jsEscape:function(e){return e.replace(/(['\\])/g,"\\$1").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r").replace(/[\u2028]/g,"\\u2028").replace(/[\u2029]/g,"\\u2029")},createXhr:d.createXhr||function(){var e,t,n;if(typeof XMLHttpRequest!="undefined")return new XMLHttpRequest;if(typeof ActiveXObject!="undefined")for(t=0;t<3;t+=1){n=o[t];try{e=new ActiveXObject(n)}catch(r){}if(e){o=[n];break}}return e},parseName:function(e){var t,n,r,i=!1,s=e.lastIndexOf("."),o=e.indexOf("./")===0||e.indexOf("../")===0;return s!==-1&&(!o||s>1)?(t=e.substring(0,s),n=e.substring(s+1)):t=e,r=n||t,s=r.indexOf("!"),s!==-1&&(i=r.substring(s+1)==="strip",r=r.substring(0,s),n?n=r:t=r),{moduleName:t,ext:n,strip:i}},xdRegExp:/^((\w+)\:)?\/\/([^\/\\]+)/,useXhr:function(e,n,r,i){var s,o,u,a=t.xdRegExp.exec(e);return a?(s=a[2],o=a[3],o=o.split(":"),u=o[1],o=o[0],(!s||s===n)&&(!o||o.toLowerCase()===r.toLowerCase())&&(!u&&!o||u===i)):!0},finishLoad:function(e,n,r,i){r=n?t.strip(r):r,d.isBuild&&(p[e]=r),i(r)},load:function(e,n,r,i){if(i&&i.isBuild&&!i.inlineText){r();return}d.isBuild=i&&i.isBuild;var s=t.parseName(e),o=s.moduleName+(s.ext?"."+s.ext:""),u=n.toUrl(o),a=d.useXhr||t.useXhr;if(u.indexOf("empty:")===0){r();return}!f||a(u,l,c,h)?t.get(u,function(n){t.finishLoad(e,s.strip,n,r)},function(e){r.error&&r.error(e)}):n([o],function(e){t.finishLoad(s.moduleName+"."+s.ext,s.strip,e,r)})},write:function(e,n,r,i){if(p.hasOwnProperty(n)){var s=t.jsEscape(p[n]);r.asModule(e+"!"+n,"define(function () { return '"+s+"';});\n")}},writeFile:function(e,n,r,i,s){var o=t.parseName(n),u=o.ext?"."+o.ext:"",a=o.moduleName+u,f=r.toUrl(o.moduleName+u)+".js";t.load(a,r,function(n){var r=function(e){return i(f,e)};r.asModule=function(e,t){return i.asModule(e,f,t)},t.write(e,a,r,s)},s)}};if(d.env==="node"||!d.env&&typeof process!="undefined"&&process.versions&&!!process.versions.node&&!process.versions["node-webkit"]&&!process.versions["atom-shell"])n=require.nodeRequire("fs"),t.get=function(e,t,r){try{var i=n.readFileSync(e,"utf8");i[0]===""&&(i=i.substring(1)),t(i)}catch(s){r&&r(s)}};else if(d.env==="xhr"||!d.env&&t.createXhr())t.get=function(e,n,r,i){var s=t.createXhr(),o;s.open("GET",e,!0);if(i)for(o in i)i.hasOwnProperty(o)&&s.setRequestHeader(o.toLowerCase(),i[o]);d.onXhr&&d.onXhr(s,e),s.onreadystatechange=function(t){var i,o;s.readyState===4&&(i=s.status||0,i>399&&i<600?(o=new Error(e+" HTTP status: "+i),o.xhr=s,r&&r(o)):n(s.responseText),d.onXhrComplete&&d.onXhrComplete(s,e))},s.send(null)};else if(d.env==="rhino"||!d.env&&typeof Packages!="undefined"&&typeof java!="undefined")t.get=function(e,t){var n,r,i="utf-8",s=new java.io.File(e),o=java.lang.System.getProperty("line.separator"),u=new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(s),i)),a="";try{n=new java.lang.StringBuffer,r=u.readLine(),r&&r.length()&&r.charAt(0)===65279&&(r=r.substring(1)),r!==null&&n.append(r);while((r=u.readLine())!==null)n.append(o),n.append(r);a=String(n.toString())}finally{u.close()}t(a)};else if(d.env==="xpconnect"||!d.env&&typeof Components!="undefined"&&Components.classes&&Components.interfaces)r=Components.classes,i=Components.interfaces,Components.utils["import"]("resource://gre/modules/FileUtils.jsm"),s="@mozilla.org/windows-registry-key;1"in r,t.get=function(e,t){var n,o,u,a={};s&&(e=e.replace(/\//g,"\\")),u=new FileUtils.File(e);try{n=r["@mozilla.org/network/file-input-stream;1"].createInstance(i.nsIFileInputStream),n.init(u,1,0,!1),o=r["@mozilla.org/intl/converter-input-stream;1"].createInstance(i.nsIConverterInputStream),o.init(n,"utf-8",n.available(),i.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER),o.readString(n.available(),a),o.close(),n.close(),t(a.value)}catch(f){throw new Error((u&&u.path||"")+": "+f)}};return t}),define("tpl",["text","underscore"],function(e,t){"use strict";var n={},r="define('{pluginName}!{moduleName}', function () { return {source}; });\n";return{version:"0.0.2",load:function(r,i,s,o){o.tpl&&o.tpl.templateSettings&&(t.templateSettings=o.tpl.templateSettings);if(n[r])s(n[r]);else{var u=o.tpl&&o.tpl.extension||".html",a=o.tpl&&o.tpl.path||"";e.load(a+r+u,i,function(e){n[r]=t.template(e),s(n[r])},o)}},write:function(e,t,i){var s=n[t],o=s&&s.source;o&&i.asModule(e+"!"+t,r.replace("{pluginName}",e).replace("{moduleName}",t).replace("{source}",o))}}}),define("tpl!action",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="chat-message '+((__t=extra_classes)==null?"":__t)+'" data-isodate="'+((__t=isodate)==null?"":__t)+'">\n    <span class="chat-msg-author chat-msg-'+((__t=sender)==null?"":__t)+'">'+((__t=time)==null?"":__t)+" **"+((__t=username)==null?"":__t)+' </span>\n    <span class="chat-msg-content">'+((__t=message)==null?"":__t)+"</span>\n</div>\n";return __p}}),define("tpl!add_contact_dropdown",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<dl class="add-converse-contact dropdown">\n    <dt id="xmpp-contact-search" class="fancy-dropdown">\n        <a class="toggle-xmpp-contact-form icon-plus" href="#" title="'+((__t=label_click_to_chat)==null?"":__t)+'"> '+((__t=label_add_contact)==null?"":__t)+'</a>\n    </dt>\n    <dd class="search-xmpp" style="display:none"><ul></ul></dd>\n</dl>\n';return __p}}),define("tpl!add_contact_form",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<li>\n    <form class="pure-form add-xmpp-contact">\n        <input type="text"\n            name="identifier"\n            class="username"\n            placeholder="'+((__t=label_contact_username)==null?"":__t)+'"/>\n        <button class="pure-button button-primary" type="submit">'+((__t=label_add)==null?"":__t)+"</button>\n    </form>\n</li>\n";return __p}}),define("tpl!change_status_message",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<form id="set-custom-xmpp-status" class="pure-form">\n<fieldset>\n    <span class="input-button-group">\n        <input type="text" class="custom-xmpp-status" '+((__t=status_message)==null?"":__t)+' placeholder="'+((__t=label_custom_status)==null?"":__t)+'"/>\n        <input type="submit" class="pure-button button-primary" value="'+((__t=label_save)==null?"":__t)+'"/>\n    </span>\n</fieldset>\n</form>\n';return __p}}),define("tpl!chat_status",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="xmpp-status">\n    <a class="choose-xmpp-status '+((__t=chat_status)==null?"":__t)+" icon-"+((__t=chat_status)==null?"":__t)+'" data-value="'+((__t=status_message)==null?"":__t)+'" href="#" title="'+((__t=desc_change_status)==null?"":__t)+'">\n        '+((__t=status_message)==null?"":__t)+'\n    </a>\n    <a class="change-xmpp-status-message icon-pencil" href="#" title="'+((__t=desc_custom_status)==null?"":__t)+'"></a>\n</div>\n';return __p}}),define("tpl!chatarea",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="chat-area">\n    <div class="chat-content"></div>\n    <form class="sendXMPPMessage" action="" method="post">\n        ',show_toolbar&&(__p+='\n            <ul class="chat-toolbar no-text-select"></ul>\n        '),__p+='\n        <textarea type="text" class="chat-textarea" \n            placeholder="'+((__t=label_message)==null?"":__t)+'"/>\n    </form>\n</div>\n';return __p}}),define("tpl!chatbox",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="flyout box-flyout">\n    <div class="dragresize dragresize-top"></div>\n    <div class="dragresize dragresize-topleft"></div>\n    <div class="dragresize dragresize-left"></div>\n    <div class="chat-head chat-head-chatbox">\n        <a class="chatbox-btn close-chatbox-button icon-close" title="'+((__t=info_close)==null?"":__t)+'"></a>\n        <a class="chatbox-btn toggle-chatbox-button icon-minus" title="'+((__t=info_minimize)==null?"":__t)+'"></a>\n        <div class="chat-title">\n            ',url&&(__p+='\n                <a href="'+((__t=url)==null?"":__t)+'" target="_blank" class="user">\n            '),__p+="\n                    "+((__t=fullname)==null?"":__t)+"\n            ",url&&(__p+="\n                </a>\n            "),__p+='\n        </div>\n        <p class="user-custom-message"><p/>\n    </div>\n    <div class="chat-body">\n        <div class="chat-content"></div>\n        <form class="sendXMPPMessage" action="" method="post">\n            ',show_toolbar&&(__p+='\n                <ul class="chat-toolbar no-text-select"></ul>\n            '),__p+='\n        <textarea\n            type="text"\n            class="chat-textarea"\n            placeholder="'+((__t=label_personal_message)==null?"":__t)+'"/>\n        </form>\n    </div>\n</div>\n';return __p}}),define("tpl!chatroom",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="flyout box-flyout">\n    <div class="dragresize dragresize-top"></div>\n    <div class="dragresize dragresize-topleft"></div>\n    <div class="dragresize dragresize-left"></div>\n    <div class="chat-head chat-head-chatroom">\n        <a class="chatbox-btn close-chatbox-button icon-close"></a>\n        <a class="chatbox-btn toggle-chatbox-button icon-minus"></a>\n        <a class="chatbox-btn configure-chatroom-button icon-wrench" style="display:none"></a>\n        <div class="chat-title"> '+((__t=_.escape(name))==null?"":__t)+' </div>\n        <p class="chatroom-topic"><p/>\n    </div>\n    <div class="chat-body chatroom-body"><span class="spinner centered"/></div>\n</div>\n';return __p}}),define("tpl!chatroom_form",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="chatroom-form-container">\n    <form class="pure-form pure-form-stacked converse-form chatroom-form">\n        <fieldset>\n            <span class="spinner centered"/>\n        </fieldset>\n    </form>\n</div>\n';return __p}}),define("tpl!chatroom_password_form",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="chatroom-form-container">\n    <form class="pure-form converse-form chatroom-form">\n        <fieldset>\n            <legend>'+((__t=heading)==null?"":__t)+"</legend>\n            <label>"+((__t=label_password)==null?"":__t)+'</label>\n            <input type="password" name="password"/>\n        </fieldset>\n        <fieldset>\n            <input class="pure-button button-primary" type="submit" value="'+((__t=label_submit)==null?"":__t)+'"/>\n        </fieldset>\n    </form>\n</div>\n';return __p}}),define("tpl!chatroom_sidebar",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<!-- <div class="occupants"> -->\n<form class="pure-form room-invite">\n    <input class="invited-contact" placeholder="'+((__t=label_invitation)==null?"":__t)+'" type="text"/>\n</form>\n<p class="occupants-heading">'+((__t=label_occupants)==null?"":__t)+':</p>\n<ul class="occupant-list"></ul>\n<!-- </div> -->\n';return __p}}),define("tpl!chatrooms_tab",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<li><a class="s" href="#chatrooms">'+((__t=label_rooms)==null?"":__t)+"</a></li>\n";return __p}}),define("tpl!chats_panel",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div id="minimized-chats">\n    <a id="toggle-minimized-chats" href="#"></a>\n    <div class="flyout minimized-chats-flyout"></div>\n</div>\n';return __p}}),define("tpl!choose_status",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<dl id="target" class="dropdown">\n    <dt id="fancy-xmpp-status-select" class="fancy-dropdown"></dt>\n    <dd><ul class="xmpp-status-menu"></ul></dd>\n</dl>\n';return __p}}),define("tpl!contacts_panel",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<form class="pure-form set-xmpp-status" action="" method="post">\n    <span id="xmpp-status-holder">\n        <select id="select-xmpp-status" style="display:none">\n            <option value="online">'+((__t=label_online)==null?"":__t)+'</option>\n            <option value="dnd">'+((__t=label_busy)==null?"":__t)+'</option>\n            <option value="away">'+((__t=label_away)==null?"":__t)+'</option>\n            <option value="offline">'+((__t=label_offline)==null?"":__t)+"</option>\n            ",allow_logout&&(__p+='\n            <option value="logout">'+((__t=label_logout)==null?"":__t)+"</option>\n            "),__p+="\n        </select>\n    </span>\n</form>\n";return __p}}),define("tpl!contacts_tab",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<li><a class="s current" href="#users">'+((__t=label_contacts)==null?"":__t)+"</a></li>\n";return __p}}),define("tpl!controlbox",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="flyout box-flyout">\n    <div class="dragresize dragresize-top"></div>\n    <div class="dragresize dragresize-topleft"></div>\n    <div class="dragresize dragresize-left"></div>\n    <div class="chat-head controlbox-head">\n        <ul id="controlbox-tabs"></ul>\n        <a class="chatbox-btn close-chatbox-button icon-close"></a>\n    </div>\n    <div class="controlbox-panes"></div>\n</div>\n';return __p}}),define("tpl!controlbox_toggle",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<span class="conn-feedback">'+((__t=label_toggle)==null?"":__t)+'</span>\n<span style="display: none" id="online-count">(0)</span>\n';return __p}}),define("tpl!field",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<field var="'+((__t=name)==null?"":__t)+'">',_.isArray(value)?(__p+="\n    ",_.each(value,function(e){__p+="<value>"+((__t=e)==null?"":__t)+"</value>"}),__p+="\n"):__p+="\n    <value>"+((__t=value)==null?"":__t)+"</value>\n",__p+="</field>\n";return __p}}),define("tpl!form_captcha",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+="",label&&(__p+="\n<label>\n    "+((__t=label)==null?"":__t)+"\n</label>\n"),__p+='\n<img src="data:'+((__t=type)==null?"":__t)+";base64,"+((__t=data)==null?"":__t)+'">\n<input name="'+((__t=name)==null?"":__t)+'" type="text" ',required&&(__p+=' class="required" '),__p+=" >\n\n\n";return __p}}),define("tpl!form_checkbox",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+="<label>"+((__t=label)==null?"":__t)+'</label>\n<input name="'+((__t=name)==null?"":__t)+'" type="'+((__t=type)==null?"":__t)+'" '+((__t=checked)==null?"":__t)+">\n";return __p}}),define("tpl!form_input",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+="",label&&(__p+="\n<label>\n    "+((__t=label)==null?"":__t)+"\n</label>\n"),__p+='\n<input name="'+((__t=name)==null?"":__t)+'" type="'+((__t=type)==null?"":__t)+'" \n    ',value&&(__p+=' value="'+((__t=value)==null?"":__t)+'" '),__p+="\n    ",required&&(__p+=' class="required" '),__p+=" >\n";return __p}}),define("tpl!form_select",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+="<label>"+((__t=label)==null?"":__t)+'</label>\n<select name="'+((__t=name)==null?"":__t)+'"  ',multiple&&(__p+=' multiple="multiple" '),__p+=">"+((__t=options)==null?"":__t)+"</select>\n";return __p}}),define("tpl!form_textarea",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<label class="label-ta">'+((__t=label)==null?"":__t)+'</label>\n<textarea name="'+((__t=name)==null?"":__t)+'">'+((__t=value)==null?"":__t)+"</textarea>\n";return __p}}),define("tpl!form_username",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+="",label&&(__p+="\n<label>\n    "+((__t=label)==null?"":__t)+"\n</label>\n"),__p+='\n<div class="input-group">\n    <input name="'+((__t=name)==null?"":__t)+'" type="'+((__t=type)==null?"":__t)+'"\n        ',value&&(__p+=' value="'+((__t=value)==null?"":__t)+'" '),__p+="\n        ",required&&(__p+=' class="required" '),__p+=' />\n    <span title="'+((__t=domain)==null?"":__t)+'">'+((__t=domain)==null?"":__t)+"</span>\n</div>\n";return __p}}),define("tpl!group_header",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<a href="#" class="group-toggle icon-'+((__t=toggle_state)==null?"":__t)+'" title="'+((__t=desc_group_toggle)==null?"":__t)+'">'+((__t=label_group)==null?"":__t)+"</a>\n";return __p}}),define("tpl!info",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="chat-info">'+((__t=message)==null?"":__t)+"</div>\n";return __p}}),define("tpl!login_panel",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<form class="pure-form pure-form-stacked converse-form" id="converse-login" method="post">\n    ',auto_login&&(__p+='\n        <span class="spinner login-submit"/>\n    '),__p+="\n    ",auto_login||(__p+="\n        ",authentication==LOGIN&&(__p+="\n            <label>"+((__t=label_username)==null?"":__t)+'</label>\n            <input type="text" name="jid" placeholder="'+((__t=placeholder_username)==null?"":__t)+'">\n            <label>'+((__t=label_password)==null?"":__t)+'</label>\n            <input type="password" name="password" placeholder="'+((__t=placeholder_password)==null?"":__t)+'">\n            <input class="pure-button button-primary" type="submit" value="'+((__t=label_login)==null?"":__t)+'">\n            <span class="conn-feedback"></span>\n        '),__p+="\n        ",authentication==ANONYMOUS&&(__p+='\n            <input type="pure-button button-primary" class="submit login-anon" value="'+((__t=label_anon_login)==null?"":__t)+'"/>\n        '),__p+="\n        ",authentication==PREBIND&&(__p+="\n            <p>Disconnected.</p>\n        "),__p+="\n    "),__p+="\n</form>\n";return __p}}),define("tpl!login_tab",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<li><a class="current" href="#login-dialog">'+((__t=label_sign_in)==null?"":__t)+"</a></li>\n";return __p}}),define("tpl!message",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<div class="chat-message '+((__t=extra_classes)==null?"":__t)+'" data-isodate="'+((__t=isodate)==null?"":__t)+'" data-msgid="'+((__t=msgid)==null?"":__t)+'">\n    <span class="chat-msg-author chat-msg-'+((__t=sender)==null?"":__t)+'">'+((__t=time)==null?"":__t)+" "+((__t=username)==null?"":__t)+':&nbsp;</span>\n    <span class="chat-msg-content">'+((__t=message)==null?"":__t)+"</span>\n</div>\n";return __p}}),define("tpl!new_day",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<time class="chat-info chat-date" data-isodate="'+((__t=isodate)==null?"":__t)+'">'+((__t=datestring)==null?"":__t)+"</time>\n";return __p}}),define("tpl!occupant",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<li class="'+((__t=role)==null?"":__t)+'"\n    ',role==="moderator"&&(__p+='\n       title="'+((__t=desc_moderator)==null?"":__t)+'"\n    '),__p+="\n    ",role==="occupant"&&(__p+='\n       title="'+((__t=desc_occupant)==null?"":__t)+'"\n    '),__p+="\n    ",role==="visitor"&&(__p+='\n       title="'+((__t=desc_visitor)==null?"":__t)+'"\n    '),__p+="\n>"+((__t=nick)==null?"":__t)+"</li>\n";return __p}}),define("tpl!pending_contact",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+="",allow_chat_pending_contacts&&(__p+='\n<a class="open-chat"href="#">\n'),__p+='\n<span class="pending-contact-name" title="Name: '+((__t=fullname)==null?"":__t)+"\nJID: "+((__t=jid)==null?"":__t)+'">'+((__t=fullname)==null?"":__t)+"</span> \n",allow_chat_pending_contacts&&(__p+="\n</a>\n"),__p+='\n<a class="remove-xmpp-contact icon-remove" title="'+((__t=desc_remove)==null?"":__t)+'" href="#"></a>\n';return __p}}),define("tpl!pending_contacts",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<dt class="roster-group" id="pending-xmpp-contacts"><a href="#" class="group-toggle icon-'+((__t=toggle_state)==null?"":__t)+'" title="'+((__t=desc_group_toggle)==null?"":__t)+'">'+((__t=label_pending_contacts)==null?"":__t)+"</a></dt>\n";return __p}}),define("tpl!register_panel",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<form id="converse-register" class="pure-form converse-form">\n    <span class="reg-feedback"></span>\n    <label>'+((__t=label_domain)==null?"":__t)+'</label>\n    <input type="text" name="domain" placeholder="'+((__t=domain_placeholder)==null?"":__t)+'">\n    <p class="form-help">'+((__t=help_providers)==null?"":__t)+' <a href="'+((__t=href_providers)==null?"":__t)+'" class="url" target="_blank">'+((__t=help_providers_link)==null?"":__t)+'</a>.</p>\n    <input class="pure-button button-primary" type="submit" value="'+((__t=label_register)==null?"":__t)+'">\n</form>\n';return __p}}),define("tpl!register_tab",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<li><a class="s" href="#register">'+((__t=label_register)==null?"":__t)+"</a></li>\n";return __p}}),define("tpl!registration_form",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<p class="provider-title">'+((__t=domain)==null?"":__t)+"</p>\n<a href='https://xmpp.net/result.php?domain="+((__t=domain)==null?"":__t)+"&amp;type=client'>\n    <img class=\"provider-score\" src='https://xmpp.net/badge.php?domain="+((__t=domain)==null?"":__t)+"' alt='xmpp.net score' />\n</a>\n<p class=\"title\">"+((__t=title)==null?"":__t)+'</p>\n<p class="instructions">'+((__t=instructions)==null?"":__t)+"</p>\n";return __p}}),define("tpl!registration_request",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<span class="spinner login-submit"/>\n<p class="info">'+((__t=info_message)==null?"":__t)+'</p>\n<button class="pure-button button-cancel hor_centered">'+((__t=cancel)==null?"":__t)+"</button>\n";return __p}}),define("tpl!requesting_contact",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+="",allow_chat_pending_contacts&&(__p+='\n<a class="open-chat"href="#">\n'),__p+='\n<span class="req-contact-name" title="Name: '+((__t=fullname)==null?"":__t)+"\nJID: "+((__t=jid)==null?"":__t)+'">'+((__t=fullname)==null?"":__t)+"</span>\n",allow_chat_pending_contacts&&(__p+="\n</a>\n"),__p+='\n<span class="request-actions">\n    <a class="accept-xmpp-request icon-checkmark" title="'+((__t=desc_accept)==null?"":__t)+'" href="#"></a>\n    <a class="decline-xmpp-request icon-close" title="'+((__t=desc_decline)==null?"":__t)+'" href="#"></a>\n</span>\n';return __p}}),define("tpl!requesting_contacts",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<dt class="roster-group" id="xmpp-contact-requests"><a href="#" class="group-toggle icon-'+((__t=toggle_state)==null?"":__t)+'" title="'+((__t=desc_group_toggle)==null?"":__t)+'">'+((__t=label_contact_requests)==null?"":__t)+"</a></dt>\n";return __p}}),define("tpl!room_description",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<!-- FIXME: check markup in mockup -->\n<div class="room-info">\n<p class="room-info"><strong>'+((__t=label_desc)==null?"":__t)+"</strong> "+((__t=desc)==null?"":__t)+'</p>\n<p class="room-info"><strong>'+((__t=label_occ)==null?"":__t)+"</strong> "+((__t=occ)==null?"":__t)+'</p>\n<p class="room-info"><strong>'+((__t=label_features)==null?"":__t)+"</strong>\n    <ul>\n        ",passwordprotected&&(__p+='\n        <li class="room-info locked">'+((__t=label_requires_auth)==null?"":__t)+"</li>\n        "),__p+="\n        ",hidden&&(__p+='\n        <li class="room-info">'+((__t=label_hidden)==null?"":__t)+"</li>\n        "),__p+="\n        ",membersonly&&(__p+='\n        <li class="room-info">'+((__t=label_requires_invite)==null?"":__t)+"</li>\n        "),__p+="\n        ",moderated&&(__p+='\n        <li class="room-info">'+((__t=label_moderated)==null?"":__t)+"</li>\n        "),__p+="\n        ",nonanonymous&&(__p+='\n        <li class="room-info">'+((__t=label_non_anon)==null?"":__t)+"</li>\n        "),__p+="\n        ",open&&(__p+='\n        <li class="room-info">'+((__t=label_open_room)==null?"":__t)+"</li>\n        "),__p+="\n        ",persistent&&(__p+='\n        <li class="room-info">'+((__t=label_permanent_room)==null?"":__t)+"</li>\n        "),__p+="\n        ",publicroom&&(__p+='\n        <li class="room-info">'+((__t=label_public)==null?"":__t)+"</li>\n        "),__p+="\n        ",semianonymous&&(__p+='\n        <li class="room-info">'+((__t=label_semi_anon)==null?"":__t)+"</li>\n        "),__p+="\n        ",temporary&&(__p+='\n        <li class="room-info">'+((__t=label_temp_room)==null?"":__t)+"</li>\n        "),__p+="\n        ",unmoderated&&(__p+='\n        <li class="room-info">'+((__t=label_unmoderated)==null?"":__t)+"</li>\n        "),__p+="\n    </ul>\n</p>\n</div>\n";return __p}}),define("tpl!room_item",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<dd class="available-chatroom">\n<a class="open-room" data-room-jid="'+((__t=jid)==null?"":__t)+'"\n   title="'+((__t=open_title)==null?"":__t)+'" href="#">'+((__t=_.escape(name))==null?"":__t)+'</a>\n<a class="room-info icon-room-info" data-room-jid="'+((__t=jid)==null?"":__t)+'"\n   title="'+((__t=info_title)==null?"":__t)+'" href="#">&nbsp;</a>\n</dd>\n';return __p}}),define("tpl!room_panel",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<form class="pure-form pure-form-stacked converse-form add-chatroom" action="" method="post">\n    <fieldset>\n        <label>'+((__t=label_room_name)==null?"":__t)+'</label>\n        <input type="text" name="chatroom" class="new-chatroom-name" placeholder="'+((__t=label_room_name)==null?"":__t)+'"/>\n        <label>'+((__t=label_nickname)==null?"":__t)+'</label> <input type="text" name="nick" class="new-chatroom-nick" placeholder="'+((__t=label_nickname)==null?"":__t)+'"/>\n        <input type="submit" class="pure-button button-primary" name="join" value="'+((__t=label_join)==null?"":__t)+'"/>\n    </fieldset>\n    <fieldset>\n        ',server_input_type!="hidden"&&(__p+="\n            <label"+((__t=server_label_global_attr)==null?"":__t)+">"+((__t=label_server)==null?"":__t)+"</label>\n        "),__p+='\n        <input type="'+((__t=server_input_type)==null?"":__t)+'" name="server" class="new-chatroom-server" placeholder="'+((__t=label_server)==null?"":__t)+'"/>\n        <input type="button" class="pure-button button-secondary" name="show" id="show-rooms" value="'+((__t=label_show_rooms)==null?"":__t)+'"/>\n    </fieldset>\n</form>\n<dl id="available-chatrooms"></dl>\n';return __p}}),define("tpl!roster",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<form class="pure-form roster-filter-group input-button-group">\n    <input style="display: none;" class="roster-filter" placeholder="'+((__t=placeholder)==null?"":__t)+'">\n    <select style="display: none;" class="filter-type">\n        <option value="contacts">'+((__t=label_contacts)==null?"":__t)+'</option>\n        <option value="groups">'+((__t=label_groups)==null?"":__t)+"</option>\n    </select>\n</form>\n";return __p}}),define("tpl!roster_item",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<a class="open-chat" title="'+((__t=title_fullname)==null?"":__t)+": "+((__t=fullname)==null?"":__t)+"\nJID: "+((__t=jid)==null?"":__t)+"\n"+((__t=desc_chat)==null?"":__t)+'" href="#"><span class="icon-'+((__t=chat_status)==null?"":__t)+'" title="'+((__t=desc_status)==null?"":__t)+'"></span>'+((__t=fullname)==null?"":__t)+"</a>\n",allow_contact_removal&&(__p+='\n<a class="remove-xmpp-contact icon-remove" title="'+((__t=desc_remove)==null?"":__t)+'" href="#"></a>\n'),__p+="\n";return __p}}),define("tpl!search_contact",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<li>\n    <form class="search-xmpp-contact">\n        <input type="text"\n            name="identifier"\n            class="username"\n            placeholder="'+((__t=label_contact_name)==null?"":__t)+'"/>\n        <button type="submit">'+((__t=label_search)==null?"":__t)+"</button>\n    </form>\n</li>\n";return __p}}),define("tpl!select_option",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<option value="'+((__t=value)==null?"":__t)+'" ',selected&&(__p+=' selected="selected" '),__p+=" >"+((__t=label)==null?"":__t)+"</option>\n";return __p}}),define("tpl!status_option",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<li>\n    <a href="#" class="'+((__t=value)==null?"":__t)+'" data-value="'+((__t=value)==null?"":__t)+'">\n        <span class="icon-'+((__t=value)==null?"":__t)+'"></span>\n        '+((__t=text)==null?"":__t)+"\n    </a>\n</li>\n";return __p}}),define("tpl!toggle_chats",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+=""+((__t=Minimized)==null?"":__t)+' <span id="minimized-count">('+((__t=num_minimized)==null?"":__t)+')</span>\n<span class="unread-message-count"\n    ',num_unread||(__p+=' style="display: none" '),__p+='\n    href="#">'+((__t=num_unread)==null?"":__t)+"</span>\n";return __p}}),define("tpl!toolbar",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+="",show_emoticons&&(__p+='\n    <li class="toggle-smiley icon-happy" title="'+((__t=label_insert_smiley)==null?"":__t)+'">\n        <ul>\n            <li><a class="icon-smiley" href="#" data-emoticon=":)"></a></li>\n            <li><a class="icon-wink" href="#" data-emoticon=";)"></a></li>\n            <li><a class="icon-grin" href="#" data-emoticon=":D"></a></li>\n            <li><a class="icon-tongue" href="#" data-emoticon=":P"></a></li>\n            <li><a class="icon-cool" href="#" data-emoticon="8)"></a></li>\n            <li><a class="icon-evil" href="#" data-emoticon=">:)"></a></li>\n            <li><a class="icon-confused" href="#" data-emoticon=":S"></a></li>\n            <li><a class="icon-wondering" href="#" data-emoticon=":\\"></a></li>\n            <li><a class="icon-angry" href="#" data-emoticon=">:("></a></li>\n            <li><a class="icon-sad" href="#" data-emoticon=":("></a></li>\n            <li><a class="icon-shocked" href="#" data-emoticon=":O"></a></li>\n            <li><a class="icon-thumbs-up" href="#" data-emoticon="(^.^)b"></a></li>\n            <li><a class="icon-heart" href="#" data-emoticon="<3"></a></li>\n        </ul>\n    </li>\n'),__p+="\n",show_call_button&&(__p+='\n<li class="toggle-call"><a class="icon-phone" title="'+((__t=label_start_call)==null?"":__t)+'"></a></li>\n'),__p+="\n",show_occupants_toggle&&(__p+='\n<li class="toggle-occupants"><a class="icon-hide-users" title="'+((__t=label_hide_occupants)==null?"":__t)+'"></a></li>\n'),__p+="\n",show_clear_button&&(__p+='\n<li class="toggle-clear"><a class="icon-remove" title="'+((__t=label_clear)==null?"":__t)+'"></a></li>\n'),__p+="\n",allow_otr&&(__p+='\n    <li class="toggle-otr '+((__t=otr_status_class)==null?"":__t)+'" title="'+((__t=otr_tooltip)==null?"":__t)+'">\n        <span class="chat-toolbar-text">'+((__t=otr_translated_status)==null?"":__t)+"</span>\n        ",otr_status==UNENCRYPTED&&(__p+='\n            <span class="icon-unlocked"></span>\n        '),__p+="\n        ",otr_status==UNVERIFIED&&(__p+='\n            <span class="icon-lock"></span>\n        '),__p+="\n        ",otr_status==VERIFIED&&(__p+='\n            <span class="icon-lock"></span>\n        '),__p+="\n        ",otr_status==FINISHED&&(__p+='\n            <span class="icon-unlocked"></span>\n        '),__p+="\n        <ul>\n            ",otr_status==UNENCRYPTED&&(__p+='\n               <li><a class="start-otr" href="#">'+((__t=label_start_encrypted_conversation)==null?"":__t)+"</a></li>\n            "),__p+="\n            ",otr_status!=UNENCRYPTED&&(__p+='\n               <li><a class="start-otr" href="#">'+((__t=label_refresh_encrypted_conversation)==null?"":__t)+'</a></li>\n               <li><a class="end-otr" href="#">'+((__t=label_end_encrypted_conversation)==null?"":__t)+'</a></li>\n               <li><a class="auth-otr" data-scheme="smp" href="#">'+((__t=label_verify_with_smp)==null?"":__t)+"</a></li>\n            "),__p+="\n            ",otr_status==UNVERIFIED&&(__p+='\n               <li><a class="auth-otr" data-scheme="fingerprint" href="#">'+((__t=label_verify_with_fingerprints)==null?"":__t)+"</a></li>\n            "),__p+='\n            <li><a href="http://www.cypherpunks.ca/otr/help/3.2.0/levels.php" target="_blank">'+((__t=label_whats_this)==null?"":__t)+"</a></li>\n        </ul>\n    </li>\n"),__p+="\n";return __p}}),define("tpl!trimmed_chat",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<a class="chatbox-btn close-chatbox-button icon-close"></a>\n<a class="chat-head-message-count" \n    ',num_unread||(__p+=' style="display: none" '),__p+='\n    href="#">'+((__t=num_unread)==null?"":__t)+'</a>\n<a href="#" class="restore-chat" title="'+((__t=tooltip)==null?"":__t)+'">\n    '+((__t=title)==null?"":__t)+"\n</a>\n";return __p}}),define("tpl!vcard",[],function(){return function(obj){var __t,__p="",__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,"")};with(obj||{})__p+='<form class="pure-form converse-form vcard-info">\n    <fieldset>\n        <legend>The VCard info gets rendered here</legend>\n        <label>Full name:</label>\n        '+((__t=fullname)==null?"":__t)+"\n        <label>URL:</label>\n        "+((__t=url)==null?"":__t)+'\n    </fieldset>\n    <fieldset>\n        <input type="button" class="pure-button button-cancel" value="'+((__t=label_return)==null?"":__t)+'"/>\n    </fieldset>\n</form>\n';return __p}}),define("converse-templates",["tpl!action","tpl!add_contact_dropdown","tpl!add_contact_form","tpl!change_status_message","tpl!chat_status","tpl!chatarea","tpl!chatbox","tpl!chatroom","tpl!chatroom_form","tpl!chatroom_password_form","tpl!chatroom_sidebar","tpl!chatrooms_tab","tpl!chats_panel","tpl!choose_status","tpl!contacts_panel","tpl!contacts_tab","tpl!controlbox","tpl!controlbox_toggle","tpl!field","tpl!form_captcha","tpl!form_checkbox","tpl!form_input","tpl!form_select","tpl!form_textarea","tpl!form_username","tpl!group_header","tpl!info","tpl!login_panel","tpl!login_tab","tpl!message","tpl!new_day","tpl!occupant","tpl!pending_contact","tpl!pending_contacts","tpl!register_panel","tpl!register_tab","tpl!registration_form","tpl!registration_request","tpl!requesting_contact","tpl!requesting_contacts","tpl!room_description","tpl!room_item","tpl!room_panel","tpl!roster","tpl!roster_item","tpl!search_contact","tpl!select_option","tpl!status_option","tpl!toggle_chats","tpl!toolbar","tpl!trimmed_chat","tpl!vcard"],function(){return{action:arguments[0],add_contact_dropdown:arguments[1],add_contact_form:arguments[2],change_status_message:arguments[3],chat_status:arguments[4],chatarea:arguments[5],chatbox:arguments[6],chatroom:arguments[7],chatroom_form:arguments[8],chatroom_password_form:arguments[9],chatroom_sidebar:arguments[10],chatrooms_tab:arguments[11],chats_panel:arguments[12],choose_status:arguments[13],contacts_panel:arguments[14],contacts_tab:arguments[15],controlbox:arguments[16],controlbox_toggle:arguments[17],field:arguments[18],form_captcha:arguments[19],form_checkbox:arguments[20],form_input:arguments[21],form_select:arguments[22],form_textarea:arguments[23],form_username:arguments[24],group_header:arguments[25],info:arguments[26],login_panel:arguments[27],login_tab:arguments[28],message:arguments[29],new_day:arguments[30],occupant:arguments[31],pending_contact:arguments[32],pending_contacts:arguments[33],register_panel:arguments[34],register_tab:arguments[35],registration_form:arguments[36],registration_request:arguments[37],requesting_contact:arguments[38],requesting_contacts:arguments[39],room_description:arguments[40],room_item:arguments[41],room_panel:arguments[42],roster:arguments[43],roster_item:arguments[44],search_contact:arguments[45],select_option:arguments[46],status_option:arguments[47],toggle_chats:arguments[48],toolbar:arguments[49],trimmed_chat:arguments[50],vcard:arguments[51]}}),function(e,t){function l(e){return f.PF.compile(e||"nplurals=2; plural=(n != 1);")}function c(e,t){this._key=e,this._i18n=t}var n=Array.prototype,r=Object.prototype,i=n.slice,s=r.hasOwnProperty,o=n.forEach,u={},a={forEach:function(e,t,n){var r,i,a;if(e===null)return;if(o&&e.forEach===o)e.forEach(t,n);else if(e.length===+e.length){for(r=0,i=e.length;r<i;r++)if(r in e&&t.call(n,e[r],r,e)===u)return}else for(a in e)if(s.call(e,a)&&t.call(n,e[a],a,e)===u)return},extend:function(e){return this.forEach(i.call(arguments,1),function(t){for(var n in t)e[n]=t[n]}),e}},f=function(e){this.defaults={locale_data:{messages:{"":{domain:"messages",lang:"en",plural_forms:"nplurals=2; plural=(n != 1);"}}},domain:"messages"},this.options=a.extend({},this.defaults,e),this.textdomain(this.options.domain);if(e.domain&&!this.options.locale_data[this.options.domain])throw new Error("Text domain set to non-existent domain: `"+e.domain+"`")};f.context_delimiter=String.fromCharCode(4),a.extend(c.prototype,{onDomain:function(e){return this._domain=e,this},withContext:function(e){return this._context=e,this},ifPlural:function(e,t){return this._val=e,this._pkey=t,this},fetch:function(e){return{}.toString.call(e)!="[object Array]"&&(e=[].slice.call(arguments)),(e&&e.length?f.sprintf:function(e){return e})(this._i18n.dcnpgettext(this._domain,this._context,this._key,this._pkey,this._val),e)}}),a.extend(f.prototype,{translate:function(e){return new c(e,this)},textdomain:function(e){if(!e)return this._textdomain;this._textdomain=e},gettext:function(e){return this.dcnpgettext.call(this,t,t,e)},dgettext:function(e,n){return this.dcnpgettext.call(this,e,t,n)},dcgettext:function(e,n){return this.dcnpgettext.call(this,e,t,n)},ngettext:function(e,n,r){return this.dcnpgettext.call(this,t,t,e,n,r)},dngettext:function(e,n,r,i){return this.dcnpgettext.call(this,e,t,n,r,i)},dcngettext:function(e,n,r,i){return this.dcnpgettext.call(this,e,t,n,r,i)},pgettext:function(e,n){return this.dcnpgettext.call(this,t,e,n)},dpgettext:function(e,t,n){return this.dcnpgettext.call(this,e,t,n)},dcpgettext:function(e,t,n){return this.dcnpgettext.call(this,e,t,n)},npgettext:function(e,n,r,i){return this.dcnpgettext.call(this,t,e,n,r,i)},dnpgettext:function(e,t,n,r,i){return this.dcnpgettext.call(this,e,t,n,r,i)},dcnpgettext:function(e,t,n,r,i){r=r||n,e=e||this._textdomain,i=typeof i=="undefined"?1:i;var s;if(!this.options)return s=new f,s.dcnpgettext.call(s,undefined,undefined,n,r,i);if(!this.options.locale_data)throw new Error("No locale data provided.");if(!this.options.locale_data[e])throw new Error("Domain `"+e+"` was not found.");if(!this.options.locale_data[e][""])throw new Error("No locale meta information provided.");if(!n)throw new Error("No translation key found.");if(typeof i!="number"){i=parseInt(i,10);if(isNaN(i))throw new Error("The number that was passed in is not a number.")}var o=t?t+f.context_delimiter+n:n,u=this.options.locale_data,a=u[e],c=a[""].plural_forms||(u.messages||this.defaults.locale_data.messages)[""].plural_forms,h=l(c)(i)+1,p,d;if(!a)throw new Error("No domain named `"+e+"` could be found.");return p=a[o],!p||h>=p.length?(this.options.missing_key_callback&&this.options.missing_key_callback(o),d=[null,n,r],d[l(c)(i)+1]):(d=p[h],d?d:(d=[null,n,r],d[l(c)(i)+1]))}});var h=function(){function e(e){return Object.prototype.toString.call(e).slice(8,-1).toLowerCase()}function t(e,t){for(var n=[];t>0;n[--t]=e);return n.join("")}var n=function(){return n.cache.hasOwnProperty(arguments[0])||(n.cache[arguments[0]]=n.parse(arguments[0])),n.format.call(null,n.cache[arguments[0]],arguments)};return n.format=function(n,r){var i=1,s=n.length,o="",u,a=[],f,l,c,p,d,v;for(f=0;f<s;f++){o=e(n[f]);if(o==="string")a.push(n[f]);else if(o==="array"){c=n[f];if(c[2]){u=r[i];for(l=0;l<c[2].length;l++){if(!u.hasOwnProperty(c[2][l]))throw h('[sprintf] property "%s" does not exist',c[2][l]);u=u[c[2][l]]}}else c[1]?u=r[c[1]]:u=r[i++];if(/[^s]/.test(c[8])&&e(u)!="number")throw h("[sprintf] expecting number but found %s",e(u));if(typeof u=="undefined"||u===null)u="";switch(c[8]){case"b":u=u.toString(2);break;case"c":u=String.fromCharCode(u);break;case"d":u=parseInt(u,10);break;case"e":u=c[7]?u.toExponential(c[7]):u.toExponential();break;case"f":u=c[7]?parseFloat(u).toFixed(c[7]):parseFloat(u);break;case"o":u=u.toString(8);break;case"s":u=(u=String(u))&&c[7]?u.substring(0,c[7]):u;break;case"u":u=Math.abs(u);break;case"x":u=u.toString(16);break;case"X":u=u.toString(16).toUpperCase()}u=/[def]/.test(c[8])&&c[3]&&u>=0?"+"+u:u,d=c[4]?c[4]=="0"?"0":c[4].charAt(1):" ",v=c[6]-String(u).length,p=c[6]?t(d,v):"",a.push(c[5]?u+p:p+u)}}return a.join("")},n.cache={},n.parse=function(e){var t=e,n=[],r=[],i=0;while(t){if((n=/^[^\x25]+/.exec(t))!==null)r.push(n[0]);else if((n=/^\x25{2}/.exec(t))!==null)r.push("%");else{if((n=/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(t))===null)throw"[sprintf] huh?";if(n[2]){i|=1;var s=[],o=n[2],u=[];if((u=/^([a-z_][a-z_\d]*)/i.exec(o))===null)throw"[sprintf] huh?";s.push(u[1]);while((o=o.substring(u[0].length))!=="")if((u=/^\.([a-z_][a-z_\d]*)/i.exec(o))!==null)s.push(u[1]);else{if((u=/^\[(\d+)\]/.exec(o))===null)throw"[sprintf] huh?";s.push(u[1])}n[2]=s}else i|=2;if(i===3)throw"[sprintf] mixing positional and named placeholders is not (yet) supported";r.push(n)}t=t.substring(n[0].length)}return r},n}(),p=function(e,t){return t.unshift(e),h.apply(null,t)};f.parse_plural=function(e,t){return e=e.replace(/n/g,t),f.parse_expression(e)},f.sprintf=function(e,t){return{}.toString.call(t)=="[object Array]"?p(e,[].slice.call(t)):h.apply(this,[].slice.call(arguments))},f.prototype.sprintf=function(){return f.sprintf.apply(this,arguments)},f.PF={},f.PF.parse=function(e){var t=f.PF.extractPluralExpr(e);return f.PF.parser.parse.call(f.PF.parser,t)},f.PF.compile=function(e){function t(e){return e===!0?1:e?e:0}var n=f.PF.parse(e);return function(e){return t(f.PF.interpreter(n)(e))}},f.PF.interpreter=function(e){return function(t){var n;switch(e.type){case"GROUP":return f.PF.interpreter(e.expr)(t);case"TERNARY":if(f.PF.interpreter(e.expr)(t))return f.PF.interpreter(e.truthy)(t);return f.PF.interpreter(e.falsey)(t);case"OR":return f.PF.interpreter(e.left)(t)||f.PF.interpreter(e.right)(t);case"AND":return f.PF.interpreter(e.left)(t)&&f.PF.interpreter(e.right)(t);case"LT":return f.PF.interpreter(e.left)(t)<f.PF.interpreter(e.right)(t);case"GT":return f.PF.interpreter(e.left)(t)>f.PF.interpreter(e.right)(t);case"LTE":return f.PF.interpreter(e.left)(t)<=f.PF.interpreter(e.right)(t);case"GTE":return f.PF.interpreter(e.left)(t)>=f.PF.interpreter(e.right)(t);case"EQ":return f.PF.interpreter(e.left)(t)==f.PF.interpreter(e.right)(t);case"NEQ":return f.PF.interpreter(e.left)(t)!=f.PF.interpreter(e.right)(t);case"MOD":return f.PF.interpreter(e.left)(t)%f.PF.interpreter(e.right)(t);case"VAR":return t;case"NUM":return e.val;default:throw new Error("Invalid Token found.")}}},f.PF.extractPluralExpr=function(e){e=e.replace(/^\s\s*/,"").replace(/\s\s*$/,""),/;\s*$/.test(e)||(e=e.concat(";"));var t=/nplurals\=(\d+);/,n=/plural\=(.*);/,r=e.match(t),i={},s;if(r.length>1){i.nplurals=r[1],e=e.replace(t,""),s=e.match(n);if(!(s&&s.length>1))throw new Error("`plural` expression not found: "+e);return s[1]}throw new Error("nplurals not found in plural_forms string: "+e)},f.PF.parser=function(){var e={trace:function(){},yy:{},symbols_:{error:2,expressions:3,e:4,EOF:5,"?":6,":":7,"||":8,"&&":9,"<":10,"<=":11,">":12,">=":13,"!=":14,"==":15,"%":16,"(":17,")":18,n:19,NUMBER:20,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",6:"?",7:":",8:"||",9:"&&",10:"<",11:"<=",12:">",13:">=",14:"!=",15:"==",16:"%",17:"(",18:")",19:"n",20:"NUMBER"},productions_:[0,[3,2],[4,5],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,1],[4,1]],performAction:function(t,n,r,i,s,o,u){var a=o.length-1;switch(s){case 1:return{type:"GROUP",expr:o[a-1]};case 2:this.$={type:"TERNARY",expr:o[a-4],truthy:o[a-2],falsey:o[a]};break;case 3:this.$={type:"OR",left:o[a-2],right:o[a]};break;case 4:this.$={type:"AND",left:o[a-2],right:o[a]};break;case 5:this.$={type:"LT",left:o[a-2],right:o[a]};break;case 6:this.$={type:"LTE",left:o[a-2],right:o[a]};break;case 7:this.$={type:"GT",left:o[a-2],right:o[a]};break;case 8:this.$={type:"GTE",left:o[a-2],right:o[a]};break;case 9:this.$={type:"NEQ",left:o[a-2],right:o[a]};break;case 10:this.$={type:"EQ",left:o[a-2],right:o[a]};break;case 11:this.$={type:"MOD",left:o[a-2],right:o[a]};break;case 12:this.$={type:"GROUP",expr:o[a-1]};break;case 13:this.$={type:"VAR"};break;case 14:this.$={type:"NUM",val:Number(t)}}},table:[{3:1,4:2,17:[1,3],19:[1,4],20:[1,5]},{1:[3]},{5:[1,6],6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{4:17,17:[1,3],19:[1,4],20:[1,5]},{5:[2,13],6:[2,13],7:[2,13],8:[2,13],9:[2,13],10:[2,13],11:[2,13],12:[2,13],13:[2,13],14:[2,13],15:[2,13],16:[2,13],18:[2,13]},{5:[2,14],6:[2,14],7:[2,14],8:[2,14],9:[2,14],10:[2,14],11:[2,14],12:[2,14],13:[2,14],14:[2,14],15:[2,14],16:[2,14],18:[2,14]},{1:[2,1]},{4:18,17:[1,3],19:[1,4],20:[1,5]},{4:19,17:[1,3],19:[1,4],20:[1,5]},{4:20,17:[1,3],19:[1,4],20:[1,5]},{4:21,17:[1,3],19:[1,4],20:[1,5]},{4:22,17:[1,3],19:[1,4],20:[1,5]},{4:23,17:[1,3],19:[1,4],20:[1,5]},{4:24,17:[1,3],19:[1,4],20:[1,5]},{4:25,17:[1,3],19:[1,4],20:[1,5]},{4:26,17:[1,3],19:[1,4],20:[1,5]},{4:27,17:[1,3],19:[1,4],20:[1,5]},{6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[1,28]},{6:[1,7],7:[1,29],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{5:[2,3],6:[2,3],7:[2,3],8:[2,3],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,3]},{5:[2,4],6:[2,4],7:[2,4],8:[2,4],9:[2,4],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,4]},{5:[2,5],6:[2,5],7:[2,5],8:[2,5],9:[2,5],10:[2,5],11:[2,5],12:[2,5],13:[2,5],14:[2,5],15:[2,5],16:[1,16],18:[2,5]},{5:[2,6],6:[2,6],7:[2,6],8:[2,6],9:[2,6],10:[2,6],11:[2,6],12:[2,6],13:[2,6],14:[2,6],15:[2,6],16:[1,16],18:[2,6]},{5:[2,7],6:[2,7],7:[2,7],8:[2,7],9:[2,7],10:[2,7],11:[2,7],12:[2,7],13:[2,7],14:[2,7],15:[2,7],16:[1,16],18:[2,7]},{5:[2,8],6:[2,8],7:[2,8],8:[2,8],9:[2,8],10:[2,8],11:[2,8],12:[2,8],13:[2,8],14:[2,8],15:[2,8],16:[1,16],18:[2,8]},{5:[2,9],6:[2,9],7:[2,9],8:[2,9],9:[2,9],10:[2,9],11:[2,9],12:[2,9],13:[2,9],14:[2,9],15:[2,9],16:[1,16],18:[2,9]},{5:[2,10],6:[2,10],7:[2,10],8:[2,10],9:[2,10],10:[2,10],11:[2,10],12:[2,10],13:[2,10],14:[2,10],15:[2,10],16:[1,16],18:[2,10]},{5:[2,11],6:[2,11],7:[2,11],8:[2,11],9:[2,11],10:[2,11],11:[2,11],12:[2,11],13:[2,11],14:[2,11],15:[2,11],16:[2,11],18:[2,11]},{5:[2,12],6:[2,12],7:[2,12],8:[2,12],9:[2,12],10:[2,12],11:[2,12],12:[2,12],13:[2,12],14:[2,12],15:[2,12],16:[2,12],18:[2,12]},{4:30,17:[1,3],19:[1,4],20:[1,5]},{5:[2,2],6:[1,7],7:[2,2],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,2]}],defaultActions:{6:[2,1]},parseError:function(t,n){throw new Error(t)},parse:function(t){function d(e){r.length=r.length-2*e,i.length=i.length-e,s.length=s.length-e}function v(){var e;return e=n.lexer.lex()||1,typeof e!="number"&&(e=n.symbols_[e]||e),e}var n=this,r=[0],i=[null],s=[],o=this.table,u="",a=0,f=0,l=0,c=2,h=1;this.lexer.setInput(t),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,typeof this.lexer.yylloc=="undefined"&&(this.lexer.yylloc={});var p=this.lexer.yylloc;s.push(p),typeof this.yy.parseError=="function"&&(this.parseError=this.yy.parseError);var m,g,y,b,w,E,S={},x,T,N,C;for(;;){y=r[r.length-1],this.defaultActions[y]?b=this.defaultActions[y]:(m==null&&(m=v()),b=o[y]&&o[y][m]);if(typeof b=="undefined"||!b.length||!b[0]){if(!l){C=[];for(x in o[y])this.terminals_[x]&&x>2&&C.push("'"+this.terminals_[x]+"'");var k="";this.lexer.showPosition?k="Parse error on line "+(a+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+C.join(", ")+", got '"+this.terminals_[m]+"'":k="Parse error on line "+(a+1)+": Unexpected "+(m==1?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(k,{text:this.lexer.match,token:this.terminals_[m]||m,line:this.lexer.yylineno,loc:p,expected:C})}if(l==3){if(m==h)throw new Error(k||"Parsing halted.");f=this.lexer.yyleng,u=this.lexer.yytext,a=this.lexer.yylineno,p=this.lexer.yylloc,m=v()}for(;;){if(c.toString()in o[y])break;if(y==0)throw new Error(k||"Parsing halted.");d(1),y=r[r.length-1]}g=m,m=c,y=r[r.length-1],b=o[y]&&o[y][c],l=3}if(b[0]instanceof Array&&b.length>1)throw new Error("Parse Error: multiple actions possible at state: "+y+", token: "+m);switch(b[0]){case 1:r.push(m),i.push(this.lexer.yytext),s.push(this.lexer.yylloc),r.push(b[1]),m=null,g?(m=g,g=null):(f=this.lexer.yyleng,u=this.lexer.yytext,a=this.lexer.yylineno,p=this.lexer.yylloc,l>0&&l--);break;case 2:T=this.productions_[b[1]][1],S.$=i[i.length-T],S._$={first_line:s[s.length-(T||1)].first_line,last_line:s[s.length-1].last_line,first_column:s[s.length-(T||1)].first_column,last_column:s[s.length-1].last_column},E=this.performAction.call(S,u,f,a,this.yy,b[1],i,s);if(typeof E!="undefined")return E;T&&(r=r.slice(0,-1*T*2),i=i.slice(0,-1*T),s=s.slice(0,-1*T)),r.push(this.productions_[b[1]][0]),i.push(S.$),s.push(S._$),N=o[r[r.length-2]][r[r.length-1]],r.push(N);break;case 3:return!0}}return!0}},t=function(){var e={EOF:1,parseError:function(t,n){if(!this.yy.parseError)throw new Error(t);this.yy.parseError(t,n)},setInput:function(e){return this._input=e,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this},input:function(){var e=this._input[0];this.yytext+=e,this.yyleng++,this.match+=e,this.matched+=e;var t=e.match(/\n/);return t&&this.yylineno++,this._input=this._input.slice(1),e},unput:function(e){return this._input=e+this._input,this},more:function(){return this._more=!0,this},pastInput:function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?"...":"")+e.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var e=this.pastInput(),t=(new Array(e.length+1)).join("-");return e+this.upcomingInput()+"\n"+t+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var e,t,n,r;this._more||(this.yytext="",this.match="");var i=this._currentRules();for(var s=0;s<i.length;s++){t=this._input.match(this.rules[i[s]]);if(t){r=t[0].match(/\n.*/g),r&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-1:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this._more=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],e=this.performAction.call(this,this.yy,this,i[s],this.conditionStack[this.conditionStack.length-1]);if(e)return e;return}}if(this._input==="")return this.EOF;this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var t=this.next();return typeof t!="undefined"?t:this.lex()},begin:function(t){this.conditionStack.push(t)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(t){this.begin(t)}};return e.performAction=function(t,n,r,i){var s=i;switch(r){case 0:break;case 1:return 20;case 2:return 19;case 3:return 8;case 4:return 9;case 5:return 6;case 6:return 7;case 7:return 11;case 8:return 13;case 9:return 10;case 10:return 12;case 11:return 14;case 12:return 15;case 13:return 16;case 14:return 17;case 15:return 18;case 16:return 5;case 17:return"INVALID"}},e.rules=[/^\s+/,/^[0-9]+(\.[0-9]+)?\b/,/^n\b/,/^\|\|/,/^&&/,/^\?/,/^:/,/^<=/,/^>=/,/^</,/^>/,/^!=/,/^==/,/^%/,/^\(/,/^\)/,/^$/,/^./],e.conditions={INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],inclusive:!0}},e}();return e.lexer=t,e}(),typeof exports!="undefined"?(typeof module!="undefined"&&module.exports&&(exports=module.exports=f),exports.Jed=f):(typeof define=="function"&&define.amd&&define("jed",[],function(){return f}),e.Jed=f)}(this),define("text!af",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "lang": "af"\n         },\n         " e.g. conversejs.org": [\n            null,\n            "bv. conversejs.org"\n         ],\n         "unencrypted": [\n            null,\n            "nie-privaat"\n         ],\n         "unverified": [\n            null,\n            "onbevestig"\n         ],\n         "verified": [\n            null,\n            "privaat"\n         ],\n         "finished": [\n            null,\n            "afgesluit"\n         ],\n         "This contact is busy": [\n            null,\n            "Hierdie persoon is besig"\n         ],\n         "This contact is online": [\n            null,\n            "Hierdie persoon is aanlyn"\n         ],\n         "This contact is offline": [\n            null,\n            "Hierdie persoon is aflyn"\n         ],\n         "This contact is unavailable": [\n            null,\n            "Hierdie persoon is onbeskikbaar"\n         ],\n         "This contact is away for an extended period": [\n            null,\n            "Hierdie persoon is vir lank afwesig"\n         ],\n         "This contact is away": [\n            null,\n            "Hierdie persoon is afwesig"\n         ],\n         "Click to hide these contacts": [\n            null,\n            "Klik om hierdie kontakte te verskuil"\n         ],\n         "My contacts": [\n            null,\n            "My kontakte"\n         ],\n         "Pending contacts": [\n            null,\n            "Hangende kontakte"\n         ],\n         "Contact requests": [\n            null,\n            "Kontak versoeke"\n         ],\n         "Ungrouped": [\n            null,\n            "Ongegroepeer"\n         ],\n         "Contacts": [\n            null,\n            "Kontakte"\n         ],\n         "Groups": [\n            null,\n            "Groepe"\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            ""\n         ],\n         "Error": [\n            null,\n            "Fout"\n         ],\n         "Connecting": [\n            null,\n            "Verbind tans"\n         ],\n         "Authenticating": [\n            null,\n            "Besig om te bekragtig"\n         ],\n         "Authentication Failed": [\n            null,\n            "Bekragtiging het gefaal"\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            "Herstel versleutelde sessie"\n         ],\n         "Generating private key.": [\n            null,\n            "Genereer private sleutel."\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            "U webblaaier mag tydelik onreageerbaar word."\n         ],\n         "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n            null,\n            "Identiteitbevestigingsversoek van  %1$s\\n\\nU gespreksmaat probeer om u identiteit te bevestig, deur die volgende vraag te vra \\n\\n%2$s"\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            "Kon nie hierdie gebruiker se identitied bevestig nie."\n         ],\n         "Exchanging private key with contact.": [\n            null,\n            "Sleutels word met gespreksmaat uitgeruil."\n         ],\n         "Close this chat box": [\n            null,\n            "Klik om hierdie kletskas toe te maak"\n         ],\n         "Minimize this chat box": [\n            null,\n            "Minimeer hierdie kletskas"\n         ],\n         "View more information on this person": [\n            null,\n            "Wys meer inligting aangaande hierdie persoon"\n         ],\n         "Personal message": [\n            null,\n            "Persoonlike boodskap"\n         ],\n         "Are you sure you want to clear the messages from this room?": [\n            null,\n            "Is u seker dat u die boodskappe in hierdie kamer wil verwyder?"\n         ],\n         "me": [\n            null,\n            "ek"\n         ],\n         "is typing": [\n            null,\n            "tik tans"\n         ],\n         "has stopped typing": [\n            null,\n            "het opgehou tik"\n         ],\n         "has gone away": [\n            null,\n            "het weggegaan"\n         ],\n         "Show this menu": [\n            null,\n            "Vertoon hierdie keuselys"\n         ],\n         "Write in the third person": [\n            null,\n            "Skryf in die derde persoon"\n         ],\n         "Remove messages": [\n            null,\n            "Verwyder boodskappe"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            "Is u seker u wil die boodskappe in hierdie kletskas uitvee?"\n         ],\n         "Your message could not be sent": [\n            null,\n            "U boodskap kon nie gestuur word nie"\n         ],\n         "We received an unencrypted message": [\n            null,\n            "Ons het \'n onversleutelde boodskap ontvang"\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            "Ons het \'n onleesbare versleutelde boodskap ontvang"\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            "Hier is die vingerafdrukke, bevestig hulle met %1$s, buite hierdie kletskanaal \\n\\nU vingerafdruk, %2$s: %3$s\\n\\nVingerafdruk vir %1$s: %4$s\\n\\nIndien u die vingerafdrukke bevestig het, klik OK, andersinds klik Kanselleer"\n         ],\n         "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n            null,\n            "Daar sal van u verwag word om \'n sekuriteitsvraag te stel, en dan ook die antwoord tot daardie vraag te verskaf.\\n\\nU gespreksmaat sal dan daardie vraag gestel word, en indien hulle presies dieselfde antwoord (lw. hoofletters tel) verskaf, sal hul identiteit bevestig wees."\n         ],\n         "What is your security question?": [\n            null,\n            "Wat is u sekuriteitsvraag?"\n         ],\n         "What is the answer to the security question?": [\n            null,\n            "Wat is die antwoord tot die sekuriteitsvraag?"\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            "Ongeldige verifikasiemetode verskaf"\n         ],\n         "has gone offline": [\n            null,\n            "is nou aflyn"\n         ],\n         "is busy": [\n            null,\n            "is besig"\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            "U boodskappe is nie meer versleutel nie"\n         ],\n         "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n            null,\n            "U boodskappe is now versleutel maar u gespreksmaat se identiteit is nog onseker."\n         ],\n         "Your contact\'s identify has been verified.": [\n            null,\n            "U gespreksmaat se identiteit is bevestig."\n         ],\n         "Your contact has ended encryption on their end, you should do the same.": [\n            null,\n            "U gespreksmaat het versleuteling gestaak, u behoort nou dieselfde te doen."\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            "U boodskappe is nie versleutel nie. Klik hier om OTR versleuteling te aktiveer."\n         ],\n         "Your messages are encrypted, but your contact has not been verified.": [\n            null,\n            "U boodskappe is versleutel, maar u gespreksmaat se identiteit is not onseker."\n         ],\n         "Your messages are encrypted and your contact verified.": [\n            null,\n            "U boodskappe is versleutel en u gespreksmaat se identiteit bevestig."\n         ],\n         "Your contact has closed their end of the private session, you should do the same": [\n            null,\n            "U gespreksmaat het die private sessie gestaak. U behoort dieselfde te doen"\n         ],\n         "Clear all messages": [\n            null,\n            "Vee alle boodskappe uit"\n         ],\n         "End encrypted conversation": [\n            null,\n            "Beëindig versleutelde gesprek"\n         ],\n         "Insert a smiley": [\n            null,\n            ""\n         ],\n         "Hide the list of occupants": [\n            null,\n            "Verskuil die lys van deelnemers"\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            "Verfris versleutelde gesprek"\n         ],\n         "Start a call": [\n            null,\n            "Begin \'n oproep"\n         ],\n         "Start encrypted conversation": [\n            null,\n            "Begin versleutelde gesprek"\n         ],\n         "Verify with fingerprints": [\n            null,\n            "Bevestig met vingerafdrukke"\n         ],\n         "Verify with SMP": [\n            null,\n            "Bevestig met SMP"\n         ],\n         "What\'s this?": [\n            null,\n            "Wat is hierdie?"\n         ],\n         "Online": [\n            null,\n            "Aangemeld"\n         ],\n         "Busy": [\n            null,\n            "Besig"\n         ],\n         "Away": [\n            null,\n            "Afwesig"\n         ],\n         "Offline": [\n            null,\n            "Afgemeld"\n         ],\n         "Log out": [\n            null,\n            "Meld af"\n         ],\n         "Contact name": [\n            null,\n            "Kontaknaam"\n         ],\n         "Search": [\n            null,\n            "Soek"\n         ],\n         "e.g. user@example.com": [\n            null,\n            ""\n         ],\n         "Add": [\n            null,\n            "Voeg by"\n         ],\n         "Click to add new chat contacts": [\n            null,\n            "Klik om nuwe kletskontakte by te voeg"\n         ],\n         "Add a contact": [\n            null,\n            "Voeg \'n kontak by"\n         ],\n         "No users found": [\n            null,\n            "Geen gebruikers gevind"\n         ],\n         "Click to add as a chat contact": [\n            null,\n            "Klik om as kletskontak by te voeg"\n         ],\n         "Room name": [\n            null,\n            "Kamer naam"\n         ],\n         "Nickname": [\n            null,\n            "Bynaam"\n         ],\n         "Server": [\n            null,\n            "Bediener"\n         ],\n         "Join Room": [\n            null,\n            "Betree kamer"\n         ],\n         "Show rooms": [\n            null,\n            "Wys kamers"\n         ],\n         "Rooms": [\n            null,\n            "Kamers"\n         ],\n         "No rooms on %1$s": [\n            null,\n            "Geen kamers op %1$s"\n         ],\n         "Rooms on %1$s": [\n            null,\n            "Kamers op %1$s"\n         ],\n         "Click to open this room": [\n            null,\n            "Klik om hierdie kletskamer te open"\n         ],\n         "Show more information on this room": [\n            null,\n            "Wys meer inligting aangaande hierdie kletskamer"\n         ],\n         "Description:": [\n            null,\n            "Beskrywing:"\n         ],\n         "Occupants:": [\n            null,\n            "Deelnemers:"\n         ],\n         "Features:": [\n            null,\n            "Eienskappe:"\n         ],\n         "Requires authentication": [\n            null,\n            "Benodig magtiging"\n         ],\n         "Hidden": [\n            null,\n            "Verskuil"\n         ],\n         "Requires an invitation": [\n            null,\n            "Benodig \'n uitnodiging"\n         ],\n         "Moderated": [\n            null,\n            "Gemodereer"\n         ],\n         "Non-anonymous": [\n            null,\n            "Nie-anoniem"\n         ],\n         "Open room": [\n            null,\n            "Oop kletskamer"\n         ],\n         "Permanent room": [\n            null,\n            "Permanente kamer"\n         ],\n         "Public": [\n            null,\n            "Publiek"\n         ],\n         "Semi-anonymous": [\n            null,\n            "Deels anoniem"\n         ],\n         "Temporary room": [\n            null,\n            "Tydelike kamer"\n         ],\n         "Unmoderated": [\n            null,\n            "Ongemodereer"\n         ],\n         "This user is a moderator": [\n            null,\n            "Hierdie gebruiker is \'n moderator"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "Hierdie gebruiker kan boodskappe na die kamer stuur"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "Hierdie gebruiker kan NIE boodskappe na die kamer stuur nie"\n         ],\n         "Invite...": [\n            null,\n            "Nooi uit..."\n         ],\n         "Occupants": [\n            null,\n            "Deelnemers"\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            "U is op die punt om %1$s na die kletskamer \\"%2$s\\" uit te nooi."\n         ],\n         "You may optionally include a message, explaining the reason for the invitation.": [\n            null,\n            "U mag na keuse \'n boodskap insluit, om bv. die rede vir die uitnodiging te staaf."\n         ],\n         "Message": [\n            null,\n            "Boodskap"\n         ],\n         "Error: could not execute the command": [\n            null,\n            "Fout: kon nie die opdrag uitvoer nie"\n         ],\n         "Error: the \\"": [\n            null,\n            ""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            ""\n         ],\n         "Ban user from room": [\n            null,\n            "Verban gebruiker uit hierdie kletskamer"\n         ],\n         "Change user role to occupant": [\n            null,\n            "Verander gebruiker se rol na lid"\n         ],\n         "Kick user from room": [\n            null,\n            "Skop gebruiker uit hierdie kletskamer"\n         ],\n         "Write in 3rd person": [\n            null,\n            "Skryf in die derde persoon"\n         ],\n         "Grant membership to a user": [\n            null,\n            "Verleen lidmaatskap aan \'n gebruiker"\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            "Verwyder gebruiker se vermoë om boodskappe te plaas"\n         ],\n         "Change your nickname": [\n            null,\n            "Verander u bynaam"\n         ],\n         "Grant moderator role to user": [\n            null,\n            "Verleen moderator rol aan gebruiker"\n         ],\n         "Grant ownership of this room": [\n            null,\n            "Verleen eienaarskap van hierdie kamer"\n         ],\n         "Revoke user\'s membership": [\n            null,\n            "Herroep gebruiker se lidmaatskap"\n         ],\n         "Set room topic": [\n            null,\n            "Stel onderwerp vir kletskamer"\n         ],\n         "Allow muted user to post messages": [\n            null,\n            "Laat stilgemaakte gebruiker toe om weer boodskappe te plaas"\n         ],\n         "Save": [\n            null,\n            "Stoor"\n         ],\n         "Cancel": [\n            null,\n            "Kanseleer"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "A fout het voorgekom terwyl probeer is om die vorm te stoor."\n         ],\n         "This chatroom requires a password": [\n            null,\n            "Hiedie kletskamer benodig \'n wagwoord"\n         ],\n         "Password: ": [\n            null,\n            "Wagwoord:"\n         ],\n         "Submit": [\n            null,\n            "Dien in"\n         ],\n         "This room is not anonymous": [\n            null,\n            "Hierdie vertrek is nie anoniem nie"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            "Hierdie vertrek wys nou onbeskikbare lede"\n         ],\n         "This room does not show unavailable members": [\n            null,\n            "Hierdie vertrek wys nie onbeskikbare lede nie"\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            "Nie-privaatheidverwante kamer instellings het verander"\n         ],\n         "Room logging is now enabled": [\n            null,\n            "Kamer log is nou aangeskakel"\n         ],\n         "Room logging is now disabled": [\n            null,\n            "Kamer log is nou afgeskakel"\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "Hiedie kamer is nou nie anoniem nie"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "Hierdie kamer is nou gedeeltelik anoniem"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "Hierdie kamer is nou ten volle anoniem"\n         ],\n         "A new room has been created": [\n            null,\n            "\'n Nuwe kamer is geskep"\n         ],\n         "You have been banned from this room": [\n            null,\n            "Jy is uit die kamer verban"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "Jy is uit die kamer geskop"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            "Jy is vanuit die kamer verwyder a.g.v \'n verandering van affiliasie"\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            "Jy is vanuit die kamer verwyder omdat die kamer nou slegs tot lede beperk word en jy nie \'n lid is nie."\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            "Jy is van hierdie kamer verwyder aangesien die MUC (Multi-user chat) diens nou afgeskakel word."\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "<strong>%1$s</strong> is verban"\n         ],\n         "<strong>%1$s</strong>\'s nickname has changed": [\n            null,\n            "<strong>%1$s</strong> se bynaam het verander"\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "<strong>%1$s</strong> is uitgeskop"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            "<strong>%1$s</strong> is verwyder a.g.v \'n verandering van affiliasie"\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            "<strong>%1$s</strong> is nie \'n lid nie, en dus verwyder"\n         ],\n         "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n            null,\n            "U bynaam is outomaties verander na: <strong>%1$s</strong>"\n         ],\n         "Your nickname has been changed to: <strong>%1$s</strong>": [\n            null,\n            "U bynaam is verander na: <strong>%1$s</strong>"\n         ],\n         "The reason given is: \\"": [\n            null,\n            "Die gegewe rede is: \\""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "Jy is nie op die ledelys van hierdie kamer nie"\n         ],\n         "No nickname was specified": [\n            null,\n            "Geen bynaam verskaf nie"\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "Jy word nie toegelaat om nog kamers te skep nie"\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "Jou bynaam voldoen nie aan die kamer se beleid nie"\n         ],\n         "Your nickname is already taken": [\n            null,\n            "Jou bynaam is reeds geneem"\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "Hierdie kamer bestaan tans (nog) nie"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "Hierdie kamer het sy maksimum aantal deelnemers bereik"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            "Onderwerp deur %1$s bygewerk na: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            "%1$s het u uitgenooi om die kletskamer %2$s te besoek"\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            "%1$s het u uitgenooi om die kletskamer %2$s te besoek, en het die volgende rede verskaf: \\"%3$s\\""\n         ],\n         "Click to restore this chat": [\n            null,\n            "Klik om hierdie klets te herstel"\n         ],\n         "Minimized": [\n            null,\n            "Geminimaliseer"\n         ],\n         "Click to remove this contact": [\n            null,\n            "Klik om hierdie kontak te verwyder"\n         ],\n         "Click to accept this contact request": [\n            null,\n            "Klik om hierdie kontakversoek te aanvaar"\n         ],\n         "Click to decline this contact request": [\n            null,\n            "Klik om hierdie kontakversoek te weier"\n         ],\n         "Click to chat with this contact": [\n            null,\n            "Klik om met hierdie kontak te klets"\n         ],\n         "Name": [\n            null,\n            ""\n         ],\n         "Are you sure you want to remove this contact?": [\n            null,\n            "Is u seker u wil hierdie gespreksmaat verwyder?"\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            ""\n         ],\n         "Are you sure you want to decline this contact request?": [\n            null,\n            "Is u seker dat u hierdie persoon se versoek wil afkeur?"\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            ""\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            ""\n         ],\n         "Type to filter": [\n            null,\n            "Tik om te filtreer"\n         ],\n         "I am %1$s": [\n            null,\n            "Ek is %1$s"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "Klik hier om jou eie statusboodskap te skryf"\n         ],\n         "Click to change your chat status": [\n            null,\n            "Klik om jou klets-status te verander"\n         ],\n         "Custom status": [\n            null,\n            "Doelgemaakte status"\n         ],\n         "online": [\n            null,\n            "aangemeld"\n         ],\n         "busy": [\n            null,\n            "besig"\n         ],\n         "away for long": [\n            null,\n            "vir lank afwesig"\n         ],\n         "away": [\n            null,\n            "afwesig"\n         ],\n         "offline": [\n            null,\n            "afgemeld"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            "U XMPP-verskaffer se domein naam:"\n         ],\n         "Fetch registration form": [\n            null,\n            "Haal die registrasie form"\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            "Wenk: A lys van publieke XMPP-verskaffers is beskikbaar"\n         ],\n         "here": [\n            null,\n            "hier"\n         ],\n         "Register": [\n            null,\n            "Registreer"\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            "Jammer, die gekose verskaffer ondersteun nie in-band registrasie nie.Probeer weer met \'n ander verskaffer."\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            "Vra tans die XMPP-bediener vir \'n registrasie vorm"\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            "Iets het fout geloop tydens koppeling met \\"%1$s\\". Is u seker dat dit bestaan?"\n         ],\n         "Now logging you in": [\n            null,\n            "U word nou aangemeld"\n         ],\n         "Registered successfully": [\n            null,\n            "Suksesvol geregistreer"\n         ],\n         "Return": [\n            null,\n            "Terug"\n         ],\n         "XMPP Username:": [\n            null,\n            "XMPP Gebruikersnaam:"\n         ],\n         "Password:": [\n            null,\n            "Wagwoord"\n         ],\n         "Click here to log in anonymously": [\n            null,\n            "Klik hier om anoniem aan te meld"\n         ],\n         "Log In": [\n            null,\n            "Meld aan"\n         ],\n         "user@server": [\n            null,\n            "gebruiker@bediener"\n         ],\n         "password": [\n            null,\n            "wagwoord"\n         ],\n         "Sign in": [\n            null,\n            "Teken in"\n         ],\n         "Toggle chat": [\n            null,\n            "Klets"\n         ]\n      }\n   }\n}'}),define("text!de",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "plural_forms": "nplurals=2; plural=(n != 1);",\n            "lang": "de"\n         },\n         " e.g. conversejs.org": [\n            null,\n            "z. B. conversejs.org"\n         ],\n         "unencrypted": [\n            null,\n            "unverschlüsselt"\n         ],\n         "unverified": [\n            null,\n            "nicht verifiziert"\n         ],\n         "verified": [\n            null,\n            "verifiziert"\n         ],\n         "finished": [\n            null,\n            "erledigt"\n         ],\n         "This contact is busy": [\n            null,\n            "Dieser Kontakt ist beschäftigt"\n         ],\n         "This contact is online": [\n            null,\n            "Dieser Kontakt ist online"\n         ],\n         "This contact is offline": [\n            null,\n            "Dieser Kontakt ist offline"\n         ],\n         "This contact is unavailable": [\n            null,\n            "Dieser Kontakt ist nicht verfügbar"\n         ],\n         "This contact is away for an extended period": [\n            null,\n            "Dieser Kontakt ist für längere Zeit abwesend"\n         ],\n         "This contact is away": [\n            null,\n            "Dieser Kontakt ist abwesend"\n         ],\n         "Click to hide these contacts": [\n            null,\n            "Hier klicken um diese Kontakte zu verstecken"\n         ],\n         "My contacts": [\n            null,\n            "Meine Kontakte"\n         ],\n         "Pending contacts": [\n            null,\n            "Unbestätigte Kontakte"\n         ],\n         "Contact requests": [\n            null,\n            "Kontaktanfragen"\n         ],\n         "Ungrouped": [\n            null,\n            "Ungruppiert"\n         ],\n         "Contacts": [\n            null,\n            "Kontakte"\n         ],\n         "Groups": [\n            null,\n            "Gruppen"\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            ""\n         ],\n         "Error": [\n            null,\n            "Fehler"\n         ],\n         "Connecting": [\n            null,\n            "Verbindungsaufbau …"\n         ],\n         "Authenticating": [\n            null,\n            "Authentifizierung"\n         ],\n         "Authentication Failed": [\n            null,\n            "Authentifizierung gescheitert"\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            "Verschlüsselte Sitzung wiederherstellen"\n         ],\n         "Generating private key.": [\n            null,\n            "Generiere privaten Schlüssel."\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            "Ihr Browser könnte langsam reagieren."\n         ],\n         "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n            null,\n            "Authentifizierungsanfrage von %1$s\\n\\nIhr Kontakt möchte durch die folgende Frage Ihre Identität verifizieren:\\n\\n%2$s"\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            "Die Identität des Benutzers konnte nicht verifiziert werden."\n         ],\n         "Exchanging private key with contact.": [\n            null,\n            "Tausche private Schlüssel mit Kontakt aus."\n         ],\n         "Minimize this chat box": [\n            null,\n            ""\n         ],\n         "Personal message": [\n            null,\n            "Persönliche Nachricht"\n         ],\n         "Are you sure you want to clear the messages from this room?": [\n            null,\n            "Sind Sie sicher, dass Sie alle Nachrichten in diesem Raum löschen möchten?"\n         ],\n         "me": [\n            null,\n            "Ich"\n         ],\n         "is typing": [\n            null,\n            "tippt"\n         ],\n         "has stopped typing": [\n            null,\n            "tippt nicht mehr"\n         ],\n         "has gone away": [\n            null,\n            "ist jetzt abwesend"\n         ],\n         "Show this menu": [\n            null,\n            "Dieses Menü anzeigen"\n         ],\n         "Write in the third person": [\n            null,\n            "In der dritten Person schreiben"\n         ],\n         "Remove messages": [\n            null,\n            "Nachrichten entfernen"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            "Sind Sie sicher, dass Sie alle Nachrichten dieses Chats löschen möchten?"\n         ],\n         "Your message could not be sent": [\n            null,\n            "Ihre Nachricht konnte nicht gesendet werden"\n         ],\n         "We received an unencrypted message": [\n            null,\n            "Wir haben eine unverschlüsselte Nachricht empfangen"\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            "Wir haben eine unlesbare Nachricht empfangen"\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            ""\n         ],\n         "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n            null,\n            ""\n         ],\n         "What is your security question?": [\n            null,\n            ""\n         ],\n         "What is the answer to the security question?": [\n            null,\n            ""\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            ""\n         ],\n         "is busy": [\n            null,\n            "ist beschäftigt"\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            ""\n         ],\n         "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n            null,\n            ""\n         ],\n         "Your contact\'s identify has been verified.": [\n            null,\n            ""\n         ],\n         "Your contact has ended encryption on their end, you should do the same.": [\n            null,\n            ""\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            ""\n         ],\n         "Your messages are encrypted, but your contact has not been verified.": [\n            null,\n            ""\n         ],\n         "Your messages are encrypted and your contact verified.": [\n            null,\n            ""\n         ],\n         "Your contact has closed their end of the private session, you should do the same": [\n            null,\n            ""\n         ],\n         "Clear all messages": [\n            null,\n            "Alle Nachrichten löschen"\n         ],\n         "End encrypted conversation": [\n            null,\n            ""\n         ],\n         "Insert a smiley": [\n            null,\n            ""\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            ""\n         ],\n         "Start a call": [\n            null,\n            ""\n         ],\n         "Start encrypted conversation": [\n            null,\n            ""\n         ],\n         "Verify with fingerprints": [\n            null,\n            ""\n         ],\n         "Verify with SMP": [\n            null,\n            ""\n         ],\n         "What\'s this?": [\n            null,\n            "Was ist das?"\n         ],\n         "Online": [\n            null,\n            "Online"\n         ],\n         "Busy": [\n            null,\n            "Beschäftigt"\n         ],\n         "Away": [\n            null,\n            "Abwesend"\n         ],\n         "Offline": [\n            null,\n            "Abgemeldet"\n         ],\n         "Log out": [\n            null,\n            "Abmelden"\n         ],\n         "Contact name": [\n            null,\n            "Name des Kontakts"\n         ],\n         "Search": [\n            null,\n            "Suche"\n         ],\n         "e.g. user@example.com": [\n            null,\n            ""\n         ],\n         "Add": [\n            null,\n            "Hinzufügen"\n         ],\n         "Click to add new chat contacts": [\n            null,\n            "Hier klicken um neuen Kontakt hinzuzufügen"\n         ],\n         "Add a contact": [\n            null,\n            "Kontakt hinzufügen"\n         ],\n         "No users found": [\n            null,\n            "Keine Benutzer gefunden"\n         ],\n         "Click to add as a chat contact": [\n            null,\n            "Hier klicken um als Kontakt hinzuzufügen"\n         ],\n         "Room name": [\n            null,\n            "Raumname"\n         ],\n         "Nickname": [\n            null,\n            "Spitzname"\n         ],\n         "Server": [\n            null,\n            "Server"\n         ],\n         "Join Room": [\n            null,\n            "Raum betreten"\n         ],\n         "Show rooms": [\n            null,\n            "Räume anzeigen"\n         ],\n         "Rooms": [\n            null,\n            "Räume"\n         ],\n         "No rooms on %1$s": [\n            null,\n            "Keine Räume auf %1$s"\n         ],\n         "Rooms on %1$s": [\n            null,\n            "Räume auf %1$s"\n         ],\n         "Click to open this room": [\n            null,\n            "Hier klicken um diesen Raum zu öffnen"\n         ],\n         "Show more information on this room": [\n            null,\n            "Mehr Information über diesen Raum zeigen"\n         ],\n         "Description:": [\n            null,\n            "Beschreibung"\n         ],\n         "Occupants:": [\n            null,\n            "Teilnehmer"\n         ],\n         "Features:": [\n            null,\n            "Funktionen:"\n         ],\n         "Requires authentication": [\n            null,\n            "Authentifizierung erforderlich"\n         ],\n         "Hidden": [\n            null,\n            "Versteckt"\n         ],\n         "Requires an invitation": [\n            null,\n            "Einladung erforderlich"\n         ],\n         "Moderated": [\n            null,\n            "Moderiert"\n         ],\n         "Non-anonymous": [\n            null,\n            "Nicht anonym"\n         ],\n         "Open room": [\n            null,\n            "Offener Raum"\n         ],\n         "Permanent room": [\n            null,\n            "Dauerhafter Raum"\n         ],\n         "Public": [\n            null,\n            "Öffentlich"\n         ],\n         "Semi-anonymous": [\n            null,\n            "Teils anonym"\n         ],\n         "Temporary room": [\n            null,\n            "Vorübergehender Raum"\n         ],\n         "Unmoderated": [\n            null,\n            "Unmoderiert"\n         ],\n         "This user is a moderator": [\n            null,\n            "Dieser Benutzer ist ein Moderator"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "Dieser Benutzer kann Nachrichten in diesem Raum verschicken"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "Dieser Benutzer kann keine Nachrichten in diesem Raum verschicken"\n         ],\n         "Invite...": [\n            null,\n            "Einladen..."\n         ],\n         "Occupants": [\n            null,\n            "Teilnehmer"\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            ""\n         ],\n         "You may optionally include a message, explaining the reason for the invitation.": [\n            null,\n            ""\n         ],\n         "Message": [\n            null,\n            "Nachricht"\n         ],\n         "Error: could not execute the command": [\n            null,\n            "Fehler: Konnte den Befehl nicht ausführen"\n         ],\n         "Error: the \\"": [\n            null,\n            ""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            ""\n         ],\n         "Ban user from room": [\n            null,\n            "Verbanne einen Benutzer aus dem Raum."\n         ],\n         "Kick user from room": [\n            null,\n            "Werfe einen Benutzer aus dem Raum."\n         ],\n         "Write in 3rd person": [\n            null,\n            "In der dritten Person schreiben"\n         ],\n         "Grant membership to a user": [\n            null,\n            ""\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            ""\n         ],\n         "Change your nickname": [\n            null,\n            "Spitznamen ändern"\n         ],\n         "Grant moderator role to user": [\n            null,\n            ""\n         ],\n         "Grant ownership of this room": [\n            null,\n            "Besitzrechte an diesem Raum vergeben"\n         ],\n         "Revoke user\'s membership": [\n            null,\n            ""\n         ],\n         "Set room topic": [\n            null,\n            "Chatraum Thema festlegen"\n         ],\n         "Allow muted user to post messages": [\n            null,\n            ""\n         ],\n         "Save": [\n            null,\n            "Speichern"\n         ],\n         "Cancel": [\n            null,\n            "Abbrechen"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "Beim Speichern des Formulars ist ein Fehler aufgetreten."\n         ],\n         "This chatroom requires a password": [\n            null,\n            "Dieser Raum erfordert ein Passwort"\n         ],\n         "Password: ": [\n            null,\n            "Passwort: "\n         ],\n         "Submit": [\n            null,\n            "Abschicken"\n         ],\n         "This room is not anonymous": [\n            null,\n            "Dieser Raum ist nicht anonym"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            "Dieser Raum zeigt jetzt nicht verfügbare Mitglieder an"\n         ],\n         "This room does not show unavailable members": [\n            null,\n            "Dieser Raum zeigt jetzt nicht verfügbare Mitglieder nicht an"\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            "Die Raumkonfiguration hat sich geändert (nicht Privatsphäre relevant)"\n         ],\n         "Room logging is now enabled": [\n            null,\n            "Nachrichten in diesem Raum werden ab jetzt protokolliert."\n         ],\n         "Room logging is now disabled": [\n            null,\n            "Nachrichten in diesem Raum werden nicht mehr protokolliert."\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "Dieser Raum ist jetzt nicht anonym"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "Dieser Raum ist jetzt teils anonym"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "Dieser Raum ist jetzt anonym"\n         ],\n         "A new room has been created": [\n            null,\n            "Ein neuer Raum wurde erstellt"\n         ],\n         "You have been banned from this room": [\n            null,\n            "Sie sind aus diesem Raum verbannt worden"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "Sie wurden aus diesem Raum hinausgeworfen"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            "Sie wurden wegen einer Zugehörigkeitsänderung entfernt"\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            "Sie wurden aus diesem Raum entfernt, da Sie kein Mitglied sind."\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            "Sie wurden aus diesem Raum entfernt, da der MUC (Multi-User Chat) Dienst gerade heruntergefahren wird."\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "<strong>%1$s</strong> ist verbannt worden"\n         ],\n         "<strong>%1$s</strong>\'s nickname has changed": [\n            null,\n            "<strong>%1$s</strong> hat den Spitznamen geändert"\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "<strong>%1$s</strong> wurde hinausgeworfen"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            "<strong>%1$s</strong> wurde wegen einer Zugehörigkeitsänderung entfernt"\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            "<strong>%1$s</strong> ist kein Mitglied und wurde daher entfernt"\n         ],\n         "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n            null,\n            "Ihr Spitzname wurde automatisiert geändert zu: <strong>%1$s</strong>"\n         ],\n         "Your nickname has been changed to: <strong>%1$s</strong>": [\n            null,\n            "Ihr Spitzname wurde geändert zu: <strong>%1$s</strong>"\n         ],\n         "The reason given is: \\"": [\n            null,\n            "Die angegebene Begründung lautet: \\""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "Sie sind nicht auf der Mitgliederliste dieses Raums"\n         ],\n         "No nickname was specified": [\n            null,\n            "Kein Spitzname festgelegt"\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "Es ist Ihnen nicht erlaubt neue Räume anzulegen"\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "Ungültiger Spitzname"\n         ],\n         "Your nickname is already taken": [\n            null,\n            "Ihre Spitzname existiert bereits."\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "Dieser Raum existiert (noch) nicht"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "Dieser Raum hat die maximale Mitgliederanzahl erreicht"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            "%1$s hat das Thema zu \\"%2$s\\" geändert"\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            "%1$s hat Sie in den Raum \\"%2$s\\" eingeladen"\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            "%1$s hat Sie in den Raum \\"%2$s\\" eingeladen. Begründung: \\"%3$s\\""\n         ],\n         "Click to restore this chat": [\n            null,\n            "Hier klicken um diesen Chat wiederherzustellen"\n         ],\n         "Minimized": [\n            null,\n            "Minimiert"\n         ],\n         "Click to remove this contact": [\n            null,\n            "Hier klicken um diesen Kontakt zu entfernen"\n         ],\n         "Click to accept this contact request": [\n            null,\n            "Hier klicken um diese Kontaktanfrage zu akzeptieren"\n         ],\n         "Click to decline this contact request": [\n            null,\n            "Hier klicken um diese Kontaktanfrage zu abzulehnen"\n         ],\n         "Click to chat with this contact": [\n            null,\n            "Hier klicken um mit diesem Kontakt zu chatten"\n         ],\n         "Name": [\n            null,\n            ""\n         ],\n         "Are you sure you want to remove this contact?": [\n            null,\n            "Wollen Sie diesen Kontakt wirklich entfernen?"\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            ""\n         ],\n         "Are you sure you want to decline this contact request?": [\n            null,\n            "Wollen Sie diese Kontaktanfrage wirklich ablehnen?"\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            ""\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            ""\n         ],\n         "Type to filter": [\n            null,\n            "Tippen um zu filtern"\n         ],\n         "I am %1$s": [\n            null,\n            "Ich bin %1$s"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "Hier klicken um Statusnachricht zu ändern"\n         ],\n         "Click to change your chat status": [\n            null,\n            "Hier klicken um Status zu ändern"\n         ],\n         "Custom status": [\n            null,\n            "Statusnachricht"\n         ],\n         "online": [\n            null,\n            "online"\n         ],\n         "busy": [\n            null,\n            "beschäftigt"\n         ],\n         "away for long": [\n            null,\n            "länger abwesend"\n         ],\n         "away": [\n            null,\n            "abwesend"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            ""\n         ],\n         "Fetch registration form": [\n            null,\n            ""\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            ""\n         ],\n         "here": [\n            null,\n            ""\n         ],\n         "Register": [\n            null,\n            ""\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            ""\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            ""\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            ""\n         ],\n         "Now logging you in": [\n            null,\n            ""\n         ],\n         "Registered successfully": [\n            null,\n            ""\n         ],\n         "Return": [\n            null,\n            "Zurück"\n         ],\n         "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n            null,\n            ""\n         ],\n         "XMPP Username:": [\n            null,\n            "XMPP Benutzername"\n         ],\n         "Password:": [\n            null,\n            "Passwort:"\n         ],\n         "Click here to log in anonymously": [\n            null,\n            "Hier klicken um anonym anzumelden"\n         ],\n         "Log In": [\n            null,\n            "Anmelden"\n         ],\n         "user@server": [\n            null,\n            ""\n         ],\n         "Sign in": [\n            null,\n            "Anmelden"\n         ],\n         "Toggle chat": [\n            null,\n            "Chat ein-/ausblenden"\n         ]\n      }\n   }\n}'}),define("text!en",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "plural_forms": "nplurals=2; plural=(n != 1);",\n            "lang": "en"\n         },\n         " e.g. conversejs.org": [\n            null,\n            ""\n         ],\n         "unencrypted": [\n            null,\n            ""\n         ],\n         "unverified": [\n            null,\n            ""\n         ],\n         "verified": [\n            null,\n            ""\n         ],\n         "finished": [\n            null,\n            ""\n         ],\n         "This contact is busy": [\n            null,\n            ""\n         ],\n         "This contact is online": [\n            null,\n            ""\n         ],\n         "This contact is offline": [\n            null,\n            ""\n         ],\n         "This contact is unavailable": [\n            null,\n            ""\n         ],\n         "This contact is away for an extended period": [\n            null,\n            ""\n         ],\n         "This contact is away": [\n            null,\n            ""\n         ],\n         "Click to hide these contacts": [\n            null,\n            ""\n         ],\n         "My contacts": [\n            null,\n            ""\n         ],\n         "Pending contacts": [\n            null,\n            ""\n         ],\n         "Contact requests": [\n            null,\n            ""\n         ],\n         "Ungrouped": [\n            null,\n            ""\n         ],\n         "Contacts": [\n            null,\n            ""\n         ],\n         "Groups": [\n            null,\n            ""\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            ""\n         ],\n         "Error": [\n            null,\n            ""\n         ],\n         "Connecting": [\n            null,\n            ""\n         ],\n         "Authenticating": [\n            null,\n            ""\n         ],\n         "Authentication Failed": [\n            null,\n            ""\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            ""\n         ],\n         "Generating private key.": [\n            null,\n            ""\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            ""\n         ],\n         "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n            null,\n            ""\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            ""\n         ],\n         "Exchanging private key with contact.": [\n            null,\n            ""\n         ],\n         "Close this chat box": [\n            null,\n            ""\n         ],\n         "Minimize this chat box": [\n            null,\n            ""\n         ],\n         "Personal message": [\n            null,\n            ""\n         ],\n         "Are you sure you want to clear the messages from this room?": [\n            null,\n            ""\n         ],\n         "me": [\n            null,\n            ""\n         ],\n         "is typing": [\n            null,\n            ""\n         ],\n         "has stopped typing": [\n            null,\n            ""\n         ],\n         "has gone away": [\n            null,\n            ""\n         ],\n         "Show this menu": [\n            null,\n            "Show this menu"\n         ],\n         "Write in the third person": [\n            null,\n            "Write in the third person"\n         ],\n         "Remove messages": [\n            null,\n            "Remove messages"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            ""\n         ],\n         "Your message could not be sent": [\n            null,\n            ""\n         ],\n         "We received an unencrypted message": [\n            null,\n            ""\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            ""\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            ""\n         ],\n         "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n            null,\n            ""\n         ],\n         "What is your security question?": [\n            null,\n            ""\n         ],\n         "What is the answer to the security question?": [\n            null,\n            ""\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            ""\n         ],\n         "has gone offline": [\n            null,\n            ""\n         ],\n         "is busy": [\n            null,\n            ""\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            ""\n         ],\n         "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n            null,\n            ""\n         ],\n         "Your contact\'s identify has been verified.": [\n            null,\n            ""\n         ],\n         "Your contact has ended encryption on their end, you should do the same.": [\n            null,\n            ""\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            ""\n         ],\n         "Your messages are encrypted, but your contact has not been verified.": [\n            null,\n            ""\n         ],\n         "Your messages are encrypted and your contact verified.": [\n            null,\n            ""\n         ],\n         "Your contact has closed their end of the private session, you should do the same": [\n            null,\n            ""\n         ],\n         "Clear all messages": [\n            null,\n            ""\n         ],\n         "End encrypted conversation": [\n            null,\n            ""\n         ],\n         "Insert a smiley": [\n            null,\n            ""\n         ],\n         "Hide the list of occupants": [\n            null,\n            ""\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            ""\n         ],\n         "Start a call": [\n            null,\n            ""\n         ],\n         "Start encrypted conversation": [\n            null,\n            ""\n         ],\n         "Verify with fingerprints": [\n            null,\n            ""\n         ],\n         "Verify with SMP": [\n            null,\n            ""\n         ],\n         "What\'s this?": [\n            null,\n            ""\n         ],\n         "Online": [\n            null,\n            ""\n         ],\n         "Busy": [\n            null,\n            ""\n         ],\n         "Away": [\n            null,\n            ""\n         ],\n         "Offline": [\n            null,\n            ""\n         ],\n         "Log out": [\n            null,\n            ""\n         ],\n         "Contact name": [\n            null,\n            ""\n         ],\n         "Search": [\n            null,\n            ""\n         ],\n         "e.g. user@example.com": [\n            null,\n            ""\n         ],\n         "Add": [\n            null,\n            ""\n         ],\n         "Click to add new chat contacts": [\n            null,\n            ""\n         ],\n         "Add a contact": [\n            null,\n            ""\n         ],\n         "No users found": [\n            null,\n            ""\n         ],\n         "Click to add as a chat contact": [\n            null,\n            ""\n         ],\n         "Room name": [\n            null,\n            ""\n         ],\n         "Nickname": [\n            null,\n            ""\n         ],\n         "Server": [\n            null,\n            "Server"\n         ],\n         "Join Room": [\n            null,\n            ""\n         ],\n         "Show rooms": [\n            null,\n            ""\n         ],\n         "Rooms": [\n            null,\n            ""\n         ],\n         "No rooms on %1$s": [\n            null,\n            ""\n         ],\n         "Rooms on %1$s": [\n            null,\n            "Rooms on %1$s"\n         ],\n         "Click to open this room": [\n            null,\n            "Click to open this room"\n         ],\n         "Show more information on this room": [\n            null,\n            "Show more information on this room"\n         ],\n         "Description:": [\n            null,\n            "Description:"\n         ],\n         "Occupants:": [\n            null,\n            "Occupants:"\n         ],\n         "Features:": [\n            null,\n            "Features:"\n         ],\n         "Requires authentication": [\n            null,\n            "Requires authentication"\n         ],\n         "Hidden": [\n            null,\n            "Hidden"\n         ],\n         "Requires an invitation": [\n            null,\n            "Requires an invitation"\n         ],\n         "Moderated": [\n            null,\n            "Moderated"\n         ],\n         "Non-anonymous": [\n            null,\n            "Non-anonymous"\n         ],\n         "Open room": [\n            null,\n            "Open room"\n         ],\n         "Permanent room": [\n            null,\n            "Permanent room"\n         ],\n         "Public": [\n            null,\n            "Public"\n         ],\n         "Semi-anonymous": [\n            null,\n            "Semi-anonymous"\n         ],\n         "Temporary room": [\n            null,\n            "Temporary room"\n         ],\n         "Unmoderated": [\n            null,\n            "Unmoderated"\n         ],\n         "This user is a moderator": [\n            null,\n            "This user is a moderator"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "This user can send messages in this room"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "This user can NOT send messages in this room"\n         ],\n         "Invite...": [\n            null,\n            ""\n         ],\n         "Occupants": [\n            null,\n            ""\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            ""\n         ],\n         "You may optionally include a message, explaining the reason for the invitation.": [\n            null,\n            ""\n         ],\n         "Message": [\n            null,\n            "Message"\n         ],\n         "Error: could not execute the command": [\n            null,\n            ""\n         ],\n         "Error: the \\"": [\n            null,\n            ""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            ""\n         ],\n         "Ban user from room": [\n            null,\n            ""\n         ],\n         "Change user role to occupant": [\n            null,\n            ""\n         ],\n         "Kick user from room": [\n            null,\n            ""\n         ],\n         "Write in 3rd person": [\n            null,\n            ""\n         ],\n         "Grant membership to a user": [\n            null,\n            ""\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            ""\n         ],\n         "Change your nickname": [\n            null,\n            ""\n         ],\n         "Grant moderator role to user": [\n            null,\n            ""\n         ],\n         "Grant ownership of this room": [\n            null,\n            ""\n         ],\n         "Revoke user\'s membership": [\n            null,\n            ""\n         ],\n         "Set room topic": [\n            null,\n            ""\n         ],\n         "Allow muted user to post messages": [\n            null,\n            ""\n         ],\n         "Save": [\n            null,\n            "Save"\n         ],\n         "Cancel": [\n            null,\n            "Cancel"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "An error occurred while trying to save the form."\n         ],\n         "This chatroom requires a password": [\n            null,\n            "This chatroom requires a password"\n         ],\n         "Password: ": [\n            null,\n            "Password: "\n         ],\n         "Submit": [\n            null,\n            "Submit"\n         ],\n         "This room is not anonymous": [\n            null,\n            "This room is not anonymous"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            "This room now shows unavailable members"\n         ],\n         "This room does not show unavailable members": [\n            null,\n            "This room does not show unavailable members"\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            "Non-privacy-related room configuration has changed"\n         ],\n         "Room logging is now enabled": [\n            null,\n            "Room logging is now enabled"\n         ],\n         "Room logging is now disabled": [\n            null,\n            "Room logging is now disabled"\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "This room is now non-anonymous"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "This room is now semi-anonymous"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "This room is now fully-anonymous"\n         ],\n         "A new room has been created": [\n            null,\n            "A new room has been created"\n         ],\n         "You have been banned from this room": [\n            null,\n            "You have been banned from this room"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "You have been kicked from this room"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            "You have been removed from this room because of an affiliation change"\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            "You have been removed from this room because the room has changed to members-only and you\'re not a member"\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            "You have been removed from this room because the MUC (Multi-user chat) service is being shut down."\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "<strong>%1$s</strong> has been banned"\n         ],\n         "<strong>%1$s</strong>\'s nickname has changed": [\n            null,\n            ""\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "<strong>%1$s</strong> has been kicked out"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            "<strong>%1$s</strong> has been removed because of an affiliation change"\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            "<strong>%1$s</strong> has been removed for not being a member"\n         ],\n         "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n            null,\n            ""\n         ],\n         "Your nickname has been changed to: <strong>%1$s</strong>": [\n            null,\n            ""\n         ],\n         "The reason given is: \\"": [\n            null,\n            ""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "You are not on the member list of this room"\n         ],\n         "No nickname was specified": [\n            null,\n            "No nickname was specified"\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "You are not allowed to create new rooms"\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "Your nickname doesn\'t conform to this room\'s policies"\n         ],\n         "Your nickname is already taken": [\n            null,\n            "Your nickname is already taken"\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "This room does not (yet) exist"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "This room has reached it\'s maximum number of occupants"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            "Topic set by %1$s to: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            ""\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            ""\n         ],\n         "Click to restore this chat": [\n            null,\n            ""\n         ],\n         "Minimized": [\n            null,\n            ""\n         ],\n         "Click to remove this contact": [\n            null,\n            "Click to remove this contact"\n         ],\n         "Click to accept this contact request": [\n            null,\n            ""\n         ],\n         "Click to decline this contact request": [\n            null,\n            ""\n         ],\n         "Click to chat with this contact": [\n            null,\n            "Click to chat with this contact"\n         ],\n         "Name": [\n            null,\n            ""\n         ],\n         "Are you sure you want to remove this contact?": [\n            null,\n            ""\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            ""\n         ],\n         "Are you sure you want to decline this contact request?": [\n            null,\n            ""\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            ""\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            ""\n         ],\n         "Type to filter": [\n            null,\n            ""\n         ],\n         "I am %1$s": [\n            null,\n            "I am %1$s"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "Click here to write a custom status message"\n         ],\n         "Click to change your chat status": [\n            null,\n            "Click to change your chat status"\n         ],\n         "Custom status": [\n            null,\n            "Custom status"\n         ],\n         "online": [\n            null,\n            "online"\n         ],\n         "busy": [\n            null,\n            "busy"\n         ],\n         "away for long": [\n            null,\n            "away for long"\n         ],\n         "away": [\n            null,\n            "away"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            ""\n         ],\n         "Fetch registration form": [\n            null,\n            ""\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            ""\n         ],\n         "here": [\n            null,\n            ""\n         ],\n         "Register": [\n            null,\n            ""\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            ""\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            ""\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            ""\n         ],\n         "Now logging you in": [\n            null,\n            ""\n         ],\n         "Registered successfully": [\n            null,\n            ""\n         ],\n         "Return": [\n            null,\n            ""\n         ],\n         "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n            null,\n            ""\n         ],\n         "XMPP Username:": [\n            null,\n            ""\n         ],\n         "Password:": [\n            null,\n            "Password:"\n         ],\n         "Click here to log in anonymously": [\n            null,\n            "Click here to log in anonymously"\n         ],\n         "Log In": [\n            null,\n            "Log In"\n         ],\n         "user@server": [\n            null,\n            ""\n         ],\n         "Sign in": [\n            null,\n            "Sign in"\n         ],\n         "Toggle chat": [\n            null,\n            ""\n         ]\n      }\n   }\n}'}),define("text!es",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "plural_forms": "nplurals=2; plural=(n != 1);",\n            "lang": "es"\n         },\n         " e.g. conversejs.org": [\n            null,\n            ""\n         ],\n         "unencrypted": [\n            null,\n            "texto plano"\n         ],\n         "unverified": [\n            null,\n            "sin verificar"\n         ],\n         "verified": [\n            null,\n            "verificado"\n         ],\n         "finished": [\n            null,\n            "finalizado"\n         ],\n         "This contact is busy": [\n            null,\n            "Este contacto está ocupado"\n         ],\n         "This contact is online": [\n            null,\n            "Este contacto está en línea"\n         ],\n         "This contact is offline": [\n            null,\n            "Este contacto está desconectado"\n         ],\n         "This contact is unavailable": [\n            null,\n            "Este contacto no está disponible"\n         ],\n         "This contact is away for an extended period": [\n            null,\n            "Este contacto está ausente por un largo periodo de tiempo"\n         ],\n         "This contact is away": [\n            null,\n            "Este contacto está ausente"\n         ],\n         "My contacts": [\n            null,\n            "Mis contactos"\n         ],\n         "Pending contacts": [\n            null,\n            "Contactos pendientes"\n         ],\n         "Contact requests": [\n            null,\n            "Solicitudes de contacto"\n         ],\n         "Ungrouped": [\n            null,\n            ""\n         ],\n         "Contacts": [\n            null,\n            "Contactos"\n         ],\n         "Groups": [\n            null,\n            ""\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            ""\n         ],\n         "Error": [\n            null,\n            "Error"\n         ],\n         "Connecting": [\n            null,\n            "Conectando"\n         ],\n         "Authenticating": [\n            null,\n            "Autenticando"\n         ],\n         "Authentication Failed": [\n            null,\n            "La autenticación falló"\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            "Re-estableciendo sesión cifrada"\n         ],\n         "Generating private key.": [\n            null,\n            "Generando llave privada"\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            "Su navegador podría dejar de responder por un momento"\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            "No se pudo verificar la identidad de este usuario"\n         ],\n         "Minimize this chat box": [\n            null,\n            ""\n         ],\n         "Personal message": [\n            null,\n            "Mensaje personal"\n         ],\n         "Are you sure you want to clear the messages from this room?": [\n            null,\n            "¿Está seguro de querer limpiar los mensajes de esta sala?"\n         ],\n         "me": [\n            null,\n            "yo"\n         ],\n         "is typing": [\n            null,\n            ""\n         ],\n         "has stopped typing": [\n            null,\n            ""\n         ],\n         "Show this menu": [\n            null,\n            "Mostrar este menú"\n         ],\n         "Write in the third person": [\n            null,\n            "Escribir en tercera persona"\n         ],\n         "Remove messages": [\n            null,\n            "Eliminar mensajes"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            "¿Está seguro de querer limpiar los mensajes de esta conversación?"\n         ],\n         "Your message could not be sent": [\n            null,\n            "Su mensaje no se pudo enviar"\n         ],\n         "We received an unencrypted message": [\n            null,\n            "Se recibío un mensaje sin cifrar"\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            "Se recibío un mensaje cifrado corrupto"\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            "Por favor confirme los identificadores de %1$s fuera de este chat.\\n\\nSu identificador es, %2$s: %3$s\\n\\nEl identificador de %1$s es: %4$s\\n\\nDespués de confirmar los identificadores haga click en OK, cancele si no concuerdan."\n         ],\n         "What is your security question?": [\n            null,\n            "Introduzca su pregunta de seguridad"\n         ],\n         "What is the answer to the security question?": [\n            null,\n            "Introduzca la respuesta a su pregunta de seguridad"\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            "Esquema de autenticación inválido"\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            "Sus mensajes han dejado de cifrarse"\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            "Sus mensajes no están cifrados. Haga click aquí para habilitar el cifrado OTR"\n         ],\n         "End encrypted conversation": [\n            null,\n            "Finalizar sesión cifrada"\n         ],\n         "Insert a smiley": [\n            null,\n            ""\n         ],\n         "Hide the list of occupants": [\n            null,\n            ""\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            "Actualizar sesión cifrada"\n         ],\n         "Start a call": [\n            null,\n            ""\n         ],\n         "Start encrypted conversation": [\n            null,\n            "Iniciar sesión cifrada"\n         ],\n         "Verify with fingerprints": [\n            null,\n            "Verificar con identificadores"\n         ],\n         "Verify with SMP": [\n            null,\n            "Verificar con SMP"\n         ],\n         "What\'s this?": [\n            null,\n            "¿Qué es esto?"\n         ],\n         "Online": [\n            null,\n            "En línea"\n         ],\n         "Busy": [\n            null,\n            "Ocupado"\n         ],\n         "Away": [\n            null,\n            "Ausente"\n         ],\n         "Offline": [\n            null,\n            "Desconectado"\n         ],\n         "Contact name": [\n            null,\n            "Nombre de contacto"\n         ],\n         "Search": [\n            null,\n            "Búsqueda"\n         ],\n         "e.g. user@example.com": [\n            null,\n            ""\n         ],\n         "Add": [\n            null,\n            "Agregar"\n         ],\n         "Click to add new chat contacts": [\n            null,\n            "Haga click para agregar nuevos contactos al chat"\n         ],\n         "Add a contact": [\n            null,\n            "Agregar un contacto"\n         ],\n         "No users found": [\n            null,\n            "Sin usuarios encontrados"\n         ],\n         "Click to add as a chat contact": [\n            null,\n            "Haga click para agregar como contacto de chat"\n         ],\n         "Room name": [\n            null,\n            "Nombre de sala"\n         ],\n         "Nickname": [\n            null,\n            "Apodo"\n         ],\n         "Server": [\n            null,\n            "Servidor"\n         ],\n         "Show rooms": [\n            null,\n            "Mostrar salas"\n         ],\n         "Rooms": [\n            null,\n            "Salas"\n         ],\n         "No rooms on %1$s": [\n            null,\n            "Sin salas en %1$s"\n         ],\n         "Rooms on %1$s": [\n            null,\n            "Salas en %1$s"\n         ],\n         "Click to open this room": [\n            null,\n            "Haga click para abrir esta sala"\n         ],\n         "Show more information on this room": [\n            null,\n            "Mostrar más información en esta sala"\n         ],\n         "Description:": [\n            null,\n            "Descripción"\n         ],\n         "Occupants:": [\n            null,\n            "Ocupantes:"\n         ],\n         "Features:": [\n            null,\n            "Características:"\n         ],\n         "Requires authentication": [\n            null,\n            "Autenticación requerida"\n         ],\n         "Hidden": [\n            null,\n            "Oculto"\n         ],\n         "Requires an invitation": [\n            null,\n            "Requiere una invitación"\n         ],\n         "Moderated": [\n            null,\n            "Moderado"\n         ],\n         "Non-anonymous": [\n            null,\n            "No anónimo"\n         ],\n         "Open room": [\n            null,\n            "Abrir sala"\n         ],\n         "Permanent room": [\n            null,\n            "Sala permanente"\n         ],\n         "Public": [\n            null,\n            "Pública"\n         ],\n         "Semi-anonymous": [\n            null,\n            "Semi anónimo"\n         ],\n         "Temporary room": [\n            null,\n            "Sala temporal"\n         ],\n         "Unmoderated": [\n            null,\n            "Sin moderar"\n         ],\n         "This user is a moderator": [\n            null,\n            "Este usuario es un moderador"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "Este usuario puede enviar mensajes en esta sala"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "Este usuario NO puede enviar mensajes en esta"\n         ],\n         "Invite...": [\n            null,\n            ""\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            ""\n         ],\n         "You may optionally include a message, explaining the reason for the invitation.": [\n            null,\n            ""\n         ],\n         "Message": [\n            null,\n            "Mensaje"\n         ],\n         "Error: could not execute the command": [\n            null,\n            ""\n         ],\n         "Error: the \\"": [\n            null,\n            ""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            ""\n         ],\n         "Change user role to occupant": [\n            null,\n            ""\n         ],\n         "Grant membership to a user": [\n            null,\n            ""\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            ""\n         ],\n         "Change your nickname": [\n            null,\n            ""\n         ],\n         "Grant moderator role to user": [\n            null,\n            ""\n         ],\n         "Revoke user\'s membership": [\n            null,\n            ""\n         ],\n         "Allow muted user to post messages": [\n            null,\n            ""\n         ],\n         "Save": [\n            null,\n            "Guardar"\n         ],\n         "Cancel": [\n            null,\n            "Cancelar"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "Un error ocurrío mientras se guardaba el formulario."\n         ],\n         "This chatroom requires a password": [\n            null,\n            "Esta sala de chat requiere una contraseña."\n         ],\n         "Password: ": [\n            null,\n            "Contraseña: "\n         ],\n         "Submit": [\n            null,\n            "Enviar"\n         ],\n         "This room is not anonymous": [\n            null,\n            "Esta sala no es para usuarios anónimos"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            "Esta sala ahora muestra los miembros no disponibles"\n         ],\n         "This room does not show unavailable members": [\n            null,\n            "Esta sala no muestra los miembros no disponibles"\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            "Una configuración de la sala no relacionada con la privacidad ha sido cambiada"\n         ],\n         "Room logging is now enabled": [\n            null,\n            "El registro de la sala ahora está habilitado"\n         ],\n         "Room logging is now disabled": [\n            null,\n            "El registro de la sala ahora está deshabilitado"\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "Esta sala ahora es pública"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "Esta sala ahora es semi-anónima"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "Esta sala ahora es completamente anónima"\n         ],\n         "A new room has been created": [\n            null,\n            "Una nueva sala ha sido creada"\n         ],\n         "You have been banned from this room": [\n            null,\n            "Usted ha sido bloqueado de esta sala"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "Usted ha sido expulsado de esta sala"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            "Usted ha sido eliminado de esta sala debido a un cambio de afiliación"\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            "Usted ha sido eliminado de esta sala debido a que la sala cambio su configuración a solo-miembros y usted no es un miembro"\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            "Usted ha sido eliminado de esta sala debido a que el servicio MUC (Multi-user chat) está deshabilitado."\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "<strong>%1$s</strong> ha sido bloqueado"\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "<strong>%1$s</strong> ha sido expulsado"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            "<strong>%1$s</strong> ha sido eliminado debido a un cambio de afiliación"\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            "<strong>%1$s</strong> ha sido eliminado debido a que no es miembro"\n         ],\n         "The reason given is: \\"": [\n            null,\n            ""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "Usted no está en la lista de miembros de esta sala"\n         ],\n         "No nickname was specified": [\n            null,\n            "Sin apodo especificado"\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "Usted no esta autorizado para crear nuevas salas"\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "Su apodo no se ajusta a la política de esta sala"\n         ],\n         "Your nickname is already taken": [\n            null,\n            "Su apodo ya ha sido tomando por otro usuario"\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "Esta sala (aún) no existe"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "Esta sala ha alcanzado su número máximo de ocupantes"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            "Tema fijado por %1$s a: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            ""\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            ""\n         ],\n         "Click to restore this chat": [\n            null,\n            "Haga click para eliminar este contacto"\n         ],\n         "Minimized": [\n            null,\n            "Minimizado"\n         ],\n         "Click to remove this contact": [\n            null,\n            "Haga click para eliminar este contacto"\n         ],\n         "Click to chat with this contact": [\n            null,\n            "Haga click para conversar con este contacto"\n         ],\n         "Name": [\n            null,\n            ""\n         ],\n         "Are you sure you want to remove this contact?": [\n            null,\n            "¿Esta seguro de querer eliminar este contacto?"\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            ""\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            ""\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            ""\n         ],\n         "Type to filter": [\n            null,\n            ""\n         ],\n         "I am %1$s": [\n            null,\n            "Estoy %1$s"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "Haga click para escribir un mensaje de estatus personalizado"\n         ],\n         "Click to change your chat status": [\n            null,\n            "Haga click para cambiar su estatus de chat"\n         ],\n         "Custom status": [\n            null,\n            "Personalizar estatus"\n         ],\n         "online": [\n            null,\n            "en línea"\n         ],\n         "busy": [\n            null,\n            "ocupado"\n         ],\n         "away for long": [\n            null,\n            "ausente por mucho tiempo"\n         ],\n         "away": [\n            null,\n            "ausente"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            ""\n         ],\n         "Fetch registration form": [\n            null,\n            ""\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            ""\n         ],\n         "here": [\n            null,\n            ""\n         ],\n         "Register": [\n            null,\n            ""\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            ""\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            ""\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            ""\n         ],\n         "Now logging you in": [\n            null,\n            ""\n         ],\n         "Registered successfully": [\n            null,\n            ""\n         ],\n         "Return": [\n            null,\n            ""\n         ],\n         "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n            null,\n            ""\n         ],\n         "Password:": [\n            null,\n            "Contraseña:"\n         ],\n         "Log In": [\n            null,\n            "Iniciar sesión"\n         ],\n         "user@server": [\n            null,\n            ""\n         ],\n         "Sign in": [\n            null,\n            "Registrar"\n         ],\n         "Toggle chat": [\n            null,\n            "Chat"\n         ]\n      }\n   }\n}'}),define("text!fr",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "plural_forms": "nplurals=2; plural=(n != 1);",\n            "lang": "fr"\n         },\n         " e.g. conversejs.org": [\n            null,\n            ""\n         ],\n         "unencrypted": [\n            null,\n            "non crypté"\n         ],\n         "unverified": [\n            null,\n            "non vérifié"\n         ],\n         "verified": [\n            null,\n            "vérifié"\n         ],\n         "finished": [\n            null,\n            "terminé"\n         ],\n         "This contact is busy": [\n            null,\n            "Ce contact est occupé"\n         ],\n         "This contact is online": [\n            null,\n            "Ce contact est connecté"\n         ],\n         "This contact is offline": [\n            null,\n            "Ce contact est déconnecté"\n         ],\n         "This contact is unavailable": [\n            null,\n            "Ce contact est indisponible"\n         ],\n         "This contact is away for an extended period": [\n            null,\n            "Ce contact est absent"\n         ],\n         "This contact is away": [\n            null,\n            "Ce contact est absent"\n         ],\n         "Click to hide these contacts": [\n            null,\n            "Cliquez pour cacher ces contacts"\n         ],\n         "My contacts": [\n            null,\n            "Mes contacts"\n         ],\n         "Pending contacts": [\n            null,\n            "Contacts en attente"\n         ],\n         "Contact requests": [\n            null,\n            "Demandes de contacts"\n         ],\n         "Ungrouped": [\n            null,\n            "Sans groupe"\n         ],\n         "Contacts": [\n            null,\n            "Contacts"\n         ],\n         "Groups": [\n            null,\n            "Groupes"\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            ""\n         ],\n         "Error": [\n            null,\n            "Erreur"\n         ],\n         "Connecting": [\n            null,\n            "Connexion"\n         ],\n         "Authenticating": [\n            null,\n            "Authentification"\n         ],\n         "Authentication Failed": [\n            null,\n            "L\'authentification a échoué"\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            "Rétablissement de la session encryptée"\n         ],\n         "Generating private key.": [\n            null,\n            "Génération de la clé privée"\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            "Votre navigateur pourrait ne plus répondre"\n         ],\n         "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n            null,\n            "Demande d\'authentification de %1$s\\n\\nVotre contact tente de vérifier votre identité, en vous posant la question ci-dessous.\\n\\n%2$s"\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            "L\'identité de cet utilisateur ne peut pas être vérifiée"\n         ],\n         "Exchanging private key with contact.": [\n            null,\n            "Échange de clé privée avec le contact"\n         ],\n         "Minimize this chat box": [\n            null,\n            ""\n         ],\n         "Personal message": [\n            null,\n            "Message personnel"\n         ],\n         "Are you sure you want to clear the messages from this room?": [\n            null,\n            "Etes-vous sûr de vouloir supprimer les messages de ce salon ?"\n         ],\n         "me": [\n            null,\n            "moi"\n         ],\n         "is typing": [\n            null,\n            "écrit"\n         ],\n         "has stopped typing": [\n            null,\n            "a arrêté d\'écrire"\n         ],\n         "has gone away": [\n            null,\n            "est parti"\n         ],\n         "Show this menu": [\n            null,\n            "Afficher ce menu"\n         ],\n         "Write in the third person": [\n            null,\n            "Écrire à la troisième personne"\n         ],\n         "Remove messages": [\n            null,\n            "Effacer les messages"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            "Êtes-vous sûr de vouloir supprimer les messages de cette conversation?"\n         ],\n         "Your message could not be sent": [\n            null,\n            "Votre message ne peut pas être envoyé"\n         ],\n         "We received an unencrypted message": [\n            null,\n            "Un message non crypté a été reçu"\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            "Un message crypté illisible a été reçu"\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            "Voici les empreintes de sécurité, veuillez les confirmer avec %1$s, en dehors de ce chat.\\n\\nEmpreinte pour vous, %2$s: %3$s\\n\\nEmpreinte pour %1$s: %4$s\\n\\nSi vous avez confirmé que les empreintes correspondent, cliquez OK, sinon cliquez Annuler."\n         ],\n         "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n            null,\n            "Vous allez être invité à fournir une question de sécurité et une réponse à cette question.\\n\\nVotre contact devra répondre à la même question et s\'il fournit la même réponse (sensible à la casse), son identité sera vérifiée."\n         ],\n         "What is your security question?": [\n            null,\n            "Quelle est votre question de sécurité?"\n         ],\n         "What is the answer to the security question?": [\n            null,\n            "Quelle est la réponse à la question de sécurité?"\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            "Schéma d\'authentification fourni non valide"\n         ],\n         "has gone offline": [\n            null,\n            "s\'est déconnecté"\n         ],\n         "is busy": [\n            null,\n            "est occupé"\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            "Vos messages ne sont plus cryptés"\n         ],\n         "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n            null,\n            "Vos messages sont maintenant cryptés mais l\'identité de votre contact n\'a pas econre été véfifiée"\n         ],\n         "Your contact\'s identify has been verified.": [\n            null,\n            "L\'identité de votre contact a été vérifiée"\n         ],\n         "Your contact has ended encryption on their end, you should do the same.": [\n            null,\n            "Votre contact a arrêté le cryptage de son côté, vous devriez le faire aussi"\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            "Vos messges ne sont pas cryptés. Cliquez ici pour activer le cryptage OTR"\n         ],\n         "Your messages are encrypted, but your contact has not been verified.": [\n            null,\n            "Vos messges sont cryptés, mais votre contact n\'a pas été vérifié"\n         ],\n         "Your messages are encrypted and your contact verified.": [\n            null,\n            "Vos messages sont cryptés et votre contact est vérifié"\n         ],\n         "Your contact has closed their end of the private session, you should do the same": [\n            null,\n            "Votre contact a fermé la session privée de son côté, vous devriez le faire aussi"\n         ],\n         "Clear all messages": [\n            null,\n            "Supprimer tous les messages"\n         ],\n         "End encrypted conversation": [\n            null,\n            "Terminer la conversation cryptée"\n         ],\n         "Insert a smiley": [\n            null,\n            ""\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            "Actualiser la conversation cryptée"\n         ],\n         "Start a call": [\n            null,\n            "Démarrer un appel"\n         ],\n         "Start encrypted conversation": [\n            null,\n            "Démarrer une conversation cryptée"\n         ],\n         "Verify with fingerprints": [\n            null,\n            "Vérifier par empreintes de sécurité"\n         ],\n         "Verify with SMP": [\n            null,\n            "Vérifier par Question/Réponse"\n         ],\n         "What\'s this?": [\n            null,\n            "Qu\'est-ce qu\'une conversation cryptée?"\n         ],\n         "Online": [\n            null,\n            "En ligne"\n         ],\n         "Busy": [\n            null,\n            "Occupé"\n         ],\n         "Away": [\n            null,\n            "Absent"\n         ],\n         "Offline": [\n            null,\n            "Déconnecté"\n         ],\n         "Log out": [\n            null,\n            "Se déconnecter"\n         ],\n         "Contact name": [\n            null,\n            "Nom du contact"\n         ],\n         "Search": [\n            null,\n            "Rechercher"\n         ],\n         "e.g. user@example.com": [\n            null,\n            ""\n         ],\n         "Add": [\n            null,\n            "Ajouter"\n         ],\n         "Click to add new chat contacts": [\n            null,\n            "Cliquez pour ajouter de nouveaux contacts"\n         ],\n         "Add a contact": [\n            null,\n            "Ajouter un contact"\n         ],\n         "No users found": [\n            null,\n            "Aucun utilisateur trouvé"\n         ],\n         "Click to add as a chat contact": [\n            null,\n            "Cliquer pour ajouter aux contacts"\n         ],\n         "Room name": [\n            null,\n            "Nom du salon"\n         ],\n         "Nickname": [\n            null,\n            "Alias"\n         ],\n         "Server": [\n            null,\n            "Serveur"\n         ],\n         "Join Room": [\n            null,\n            "Rejoindre"\n         ],\n         "Show rooms": [\n            null,\n            "Afficher les salons"\n         ],\n         "Rooms": [\n            null,\n            "Salons"\n         ],\n         "No rooms on %1$s": [\n            null,\n            "Aucun salon dans %1$s"\n         ],\n         "Rooms on %1$s": [\n            null,\n            "Salons dans %1$s"\n         ],\n         "Click to open this room": [\n            null,\n            "Cliquer pour ouvrir ce salon"\n         ],\n         "Show more information on this room": [\n            null,\n            "Afficher davantage d\'informations sur ce salon"\n         ],\n         "Description:": [\n            null,\n            "Description:"\n         ],\n         "Occupants:": [\n            null,\n            "Participants:"\n         ],\n         "Features:": [\n            null,\n            "Caractéristiques:"\n         ],\n         "Requires authentication": [\n            null,\n            "Nécessite une authentification"\n         ],\n         "Hidden": [\n            null,\n            "Masqué"\n         ],\n         "Requires an invitation": [\n            null,\n            "Nécessite une invitation"\n         ],\n         "Moderated": [\n            null,\n            "Modéré"\n         ],\n         "Non-anonymous": [\n            null,\n            "Non-anonyme"\n         ],\n         "Open room": [\n            null,\n            "Ouvrir un salon"\n         ],\n         "Permanent room": [\n            null,\n            "Salon permanent"\n         ],\n         "Public": [\n            null,\n            "Public"\n         ],\n         "Semi-anonymous": [\n            null,\n            "Semi-anonyme"\n         ],\n         "Temporary room": [\n            null,\n            "Salon temporaire"\n         ],\n         "Unmoderated": [\n            null,\n            "Non modéré"\n         ],\n         "This user is a moderator": [\n            null,\n            "Cet utilisateur est modérateur"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "Cet utilisateur peut envoyer des messages dans ce salon"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "Cet utilisateur ne peut PAS envoyer de messages dans ce salon"\n         ],\n         "Invite...": [\n            null,\n            "Inviter..."\n         ],\n         "Occupants": [\n            null,\n            "Participants:"\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            "Vous vous apprêtez à inviter %1$s dans le salon \\"%2$s\\". "\n         ],\n         "You may optionally include a message, explaining the reason for the invitation.": [\n            null,\n            "Vous pouvez facultativement ajouter un message, expliquant la raison de cette invitation."\n         ],\n         "Message": [\n            null,\n            "Message"\n         ],\n         "Error: could not execute the command": [\n            null,\n            "Erreur: la commande ne peut pas être exécutée"\n         ],\n         "Error: the \\"": [\n            null,\n            ""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            "Changer le rôle  de l\'utilisateur en administrateur"\n         ],\n         "Ban user from room": [\n            null,\n            "Bannir l\'utilisateur du salon"\n         ],\n         "Kick user from room": [\n            null,\n            "Expulser l\'utilisateur du salon"\n         ],\n         "Write in 3rd person": [\n            null,\n            "Écrire à la troisième personne"\n         ],\n         "Grant membership to a user": [\n            null,\n            "Autoriser l\'utilisateur à être membre"\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            "Retirer le droit d\'envoyer des messages"\n         ],\n         "Change your nickname": [\n            null,\n            "Changer votre alias"\n         ],\n         "Grant moderator role to user": [\n            null,\n            "Changer le rôle de l\'utilisateur en modérateur"\n         ],\n         "Grant ownership of this room": [\n            null,\n            "Accorder la propriété à ce salon"\n         ],\n         "Revoke user\'s membership": [\n            null,\n            "Révoquer l\'utilisateur des membres"\n         ],\n         "Set room topic": [\n            null,\n            "Indiquer le sujet du salon"\n         ],\n         "Allow muted user to post messages": [\n            null,\n            "Autoriser les utilisateurs muets à poster des messages"\n         ],\n         "Save": [\n            null,\n            "Enregistrer"\n         ],\n         "Cancel": [\n            null,\n            "Annuler"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "Une erreur est survenue lors de l\'enregistrement du formulaire."\n         ],\n         "This chatroom requires a password": [\n            null,\n            "Ce salon nécessite un mot de passe."\n         ],\n         "Password: ": [\n            null,\n            "Mot de passe: "\n         ],\n         "Submit": [\n            null,\n            "Soumettre"\n         ],\n         "This room is not anonymous": [\n            null,\n            "Ce salon n\'est pas anonyme"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            "Ce salon affiche maintenant les membres indisponibles"\n         ],\n         "This room does not show unavailable members": [\n            null,\n            "Ce salon n\'affiche pas les membres indisponibles"\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            "Les paramètres du salon non liés à la confidentialité ont été modifiés"\n         ],\n         "Room logging is now enabled": [\n            null,\n            "Le logging du salon est activé"\n         ],\n         "Room logging is now disabled": [\n            null,\n            "Le logging du salon est désactivé"\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "Ce salon est maintenant non-anonyme"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "Ce salon est maintenant semi-anonyme"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "Ce salon est maintenant entièrement anonyme"\n         ],\n         "A new room has been created": [\n            null,\n            "Un nouveau salon a été créé"\n         ],\n         "You have been banned from this room": [\n            null,\n            "Vous avez été banni de ce salon"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "Vous avez été expulsé de ce salon"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            "Vous avez été retiré de ce salon du fait d\'un changement d\'affiliation"\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            "Vous avez été retiré de ce salon parce que ce salon est devenu réservé aux membres et vous n\'êtes pas membre"\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            "Vous avez été retiré de ce salon parce que le service de chat multi-utilisateur a été désactivé."\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "<strong>%1$s</strong> a été banni"\n         ],\n         "<strong>%1$s</strong>\'s nickname has changed": [\n            null,\n            "<strong>%1$s</strong> a changé son nom"\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "<strong>%1$s</strong> a été expulsé"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            "<strong>%1$s</strong> a été supprimé à cause d\'un changement d\'affiliation"\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            "<strong>%1$s</strong> a été supprimé car il n\'est pas membre"\n         ],\n         "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n            null,\n            "Votre alias a été modifié automatiquement en: <strong>%1$s</strong>"\n         ],\n         "Your nickname has been changed to: <strong>%1$s</strong>": [\n            null,\n            "Votre alias a été modifié en: <strong>%1$s</strong>"\n         ],\n         "The reason given is: \\"": [\n            null,\n            "La raison indiquée est: \\""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "Vous n\'êtes pas dans la liste des membres de ce salon"\n         ],\n         "No nickname was specified": [\n            null,\n            "Aucun alias n\'a été indiqué"\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "Vous n\'êtes pas autorisé à créer des salons"\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "Votre alias n\'est pas conforme à la politique de ce salon"\n         ],\n         "Your nickname is already taken": [\n            null,\n            "Votre alias est déjà utilisé"\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "Ce salon n\'existe pas encore"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "Ce salon a atteint la limite maximale d\'occupants"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            "Le sujet \'%2$s\' a été défini par %1$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            "%1$s vous invite à rejoindre le salon: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            "%1$s vous invite à rejoindre le salon: %2$s, avec le message suivant:\\"%3$s\\""\n         ],\n         "Click to restore this chat": [\n            null,\n            "Cliquez pour afficher cette discussion"\n         ],\n         "Minimized": [\n            null,\n            "Réduit(s)"\n         ],\n         "Click to remove this contact": [\n            null,\n            "Cliquez pour supprimer ce contact"\n         ],\n         "Click to accept this contact request": [\n            null,\n            "Cliquez pour accepter la demande de ce contact"\n         ],\n         "Click to decline this contact request": [\n            null,\n            "Cliquez pour refuser la demande de ce contact"\n         ],\n         "Click to chat with this contact": [\n            null,\n            "Cliquez pour discuter avec ce contact"\n         ],\n         "Name": [\n            null,\n            ""\n         ],\n         "Are you sure you want to remove this contact?": [\n            null,\n            "Êtes-vous sûr de vouloir supprimer ce contact?"\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            ""\n         ],\n         "Are you sure you want to decline this contact request?": [\n            null,\n            "Êtes-vous sûr de vouloir refuser la demande de ce contact?"\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            ""\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            ""\n         ],\n         "Type to filter": [\n            null,\n            "Filtrer"\n         ],\n         "I am %1$s": [\n            null,\n            "Je suis %1$s"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "Cliquez ici pour indiquer votre statut personnel"\n         ],\n         "Click to change your chat status": [\n            null,\n            "Cliquez pour changer votre statut"\n         ],\n         "Custom status": [\n            null,\n            "Statut personnel"\n         ],\n         "online": [\n            null,\n            "en ligne"\n         ],\n         "busy": [\n            null,\n            "occupé"\n         ],\n         "away for long": [\n            null,\n            "absent pour une longue durée"\n         ],\n         "away": [\n            null,\n            "absent"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            "Votre domaine XMPP:"\n         ],\n         "Fetch registration form": [\n            null,\n            "Récupération du formulaire d\'enregistrement"\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            "Astuce: Une liste publique de fournisseurs XMPP est disponible"\n         ],\n         "here": [\n            null,\n            "ici"\n         ],\n         "Register": [\n            null,\n            "S\'enregistrer"\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            "Désolé, le fournisseur indiqué ne supporte pas l\'enregistrement de compte en ligne. Merci d\'essayer avec un autre fournisseur."\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            "Demande du formulaire enregistrement au serveur XMPP"\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            "Quelque chose a échoué lors de l\'établissement de la connexion avec \\"%1$s\\". Êtes-vous sure qu\'il existe ?"\n         ],\n         "Now logging you in": [\n            null,\n            "En cours de connexion"\n         ],\n         "Registered successfully": [\n            null,\n            "Enregistré avec succès"\n         ],\n         "Return": [\n            null,\n            "Retourner"\n         ],\n         "XMPP Username:": [\n            null,\n            "Nom d\'utilisateur XMPP/Jabber"\n         ],\n         "Password:": [\n            null,\n            "Mot de passe:"\n         ],\n         "Click here to log in anonymously": [\n            null,\n            "Cliquez ici pour se connecter anonymement"\n         ],\n         "Log In": [\n            null,\n            "Se connecter"\n         ],\n         "user@server": [\n            null,\n            ""\n         ],\n         "Sign in": [\n            null,\n            "S\'inscrire"\n         ],\n         "Toggle chat": [\n            null,\n            "Ouvrir IM"\n         ]\n      }\n   }\n}'}),define("text!he",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "plural_forms": "nplurals=2; plural=(n != 1);",\n            "lang": "he"\n         },\n         " e.g. conversejs.org": [\n            null,\n            " למשל conversejs.org"\n         ],\n         "unencrypted": [\n            null,\n            "לא מוצפנת"\n         ],\n         "unverified": [\n            null,\n            "לא מאומתת"\n         ],\n         "verified": [\n            null,\n            "מאומתת"\n         ],\n         "finished": [\n            null,\n            "מוגמרת"\n         ],\n         "This contact is busy": [\n            null,\n            "איש קשר זה עסוק"\n         ],\n         "This contact is online": [\n            null,\n            "איש קשר זה מקוון"\n         ],\n         "This contact is offline": [\n            null,\n            "איש קשר זה אינו מקוון"\n         ],\n         "This contact is unavailable": [\n            null,\n            "איש קשר זה לא זמין"\n         ],\n         "This contact is away for an extended period": [\n            null,\n            "איש קשר זה נעדר למשך זמן ממושך"\n         ],\n         "This contact is away": [\n            null,\n            "איש קשר זה הינו נעדר"\n         ],\n         "Click to hide these contacts": [\n            null,\n            "לחץ כדי להסתיר את אנשי קשר אלה"\n         ],\n         "My contacts": [\n            null,\n            "האנשי קשר שלי"\n         ],\n         "Pending contacts": [\n            null,\n            "אנשי קשר ממתינים"\n         ],\n         "Contact requests": [\n            null,\n            "בקשות איש קשר"\n         ],\n         "Ungrouped": [\n            null,\n            "ללא קבוצה"\n         ],\n         "Contacts": [\n            null,\n            "אנשי קשר"\n         ],\n         "Groups": [\n            null,\n            "קבוצות"\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            "מנסה להתחבר בעוד 5 שניות"\n         ],\n         "Error": [\n            null,\n            "שגיאה"\n         ],\n         "Connecting": [\n            null,\n            "כעת מתחבר"\n         ],\n         "Authenticating": [\n            null,\n            "כעת מאמת"\n         ],\n         "Authentication Failed": [\n            null,\n            "אימות נכשל"\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            "בסס מחדש ישיבה מוצפנת"\n         ],\n         "Generating private key.": [\n            null,\n            "כעת מפיק מפתח פרטי."\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            "הדפדפן שלך עשוי שלא להגיב."\n         ],\n         "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n            null,\n            "בקשת אימות מאת %1$s\\n\\nהאיש קשר שלך מנסה לאמת את הזהות שלך, בעזרת שאילת השאלה שלהלן.\\n\\n%2$s"\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            "לא היתה אפשרות לאמת את זהות משתמש זה."\n         ],\n         "Exchanging private key with contact.": [\n            null,\n            "מחליף מפתח פרטי עם איש קשר."\n         ],\n         "Minimize this chat box": [\n            null,\n            ""\n         ],\n         "Personal message": [\n            null,\n            "הודעה אישית"\n         ],\n         "Are you sure you want to clear the messages from this room?": [\n            null,\n            "האם אתה בטוח כי ברצונך לטהר את ההודעות מתוך חדר זה?"\n         ],\n         "me": [\n            null,\n            "אני"\n         ],\n         "is typing": [\n            null,\n            "מקליד(ה) כעת"\n         ],\n         "has stopped typing": [\n            null,\n            "חדל(ה) להקליד"\n         ],\n         "has gone away": [\n            null,\n            "נעדר(ת)"\n         ],\n         "Show this menu": [\n            null,\n            "הצג את תפריט זה"\n         ],\n         "Write in the third person": [\n            null,\n            "כתוב בגוף השלישי"\n         ],\n         "Remove messages": [\n            null,\n            "הסר הודעות"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            "האם אתה בטוח כי ברצונך לטהר את ההודעות מתוך תיבת שיחה זה?"\n         ],\n         "Your message could not be sent": [\n            null,\n            "ההודעה שלך לא היתה יכולה להישלח"\n         ],\n         "We received an unencrypted message": [\n            null,\n            "אנחנו קיבלנו הודעה לא מוצפנת"\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            "אנחנו קיבלנו הודעה מוצפנת לא קריאה"\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            "הרי טביעות האצבע, אנא אמת אותן עם %1$s, מחוץ לשיחה זו.\\n\\nטביעת אצבע עבורך, %2$s: %3$s\\n\\nטביעת אצבע עבור %1$s: %4$s\\n\\nהיה ואימתת כי טביעות האצבע תואמות, לחץ אישור (OK), אחרת לחץ ביטול (Cancel)."\n         ],\n         "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n            null,\n            "אתה תתבקש לספק שאלת אבטחה ולאחריה תשובה לשאלה הזו.\\n\\nהאיש קשר יתבקש עובר זאת לאותה שאלת אבטחה ואם אלו יקלידו את אותה התשובה במדויק (case sensitive), זהותם תאומת."\n         ],\n         "What is your security question?": [\n            null,\n            "מהי שאלת האבטחה שלך?"\n         ],\n         "What is the answer to the security question?": [\n            null,\n            "מהי התשובה לשאלת האבטחה?"\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            "סופקה סכימת אימות שגויה"\n         ],\n         "has gone offline": [\n            null,\n            "כבר לא מקוון"\n         ],\n         "is busy": [\n            null,\n            "עסוק(ה) כעת"\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            "ההודעות שלך אינן מוצפנות עוד"\n         ],\n         "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n            null,\n            "ההודעות שלך מוצפנות כעת אך זהות האיש קשר שלך טרם אומתה."\n         ],\n         "Your contact\'s identify has been verified.": [\n            null,\n            "זהות האיש קשר שלך אומתה."\n         ],\n         "Your contact has ended encryption on their end, you should do the same.": [\n            null,\n            "האיש קשר סיים הצפנה בקצה שלהם, עליך לעשות זאת גם כן."\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            "ההודעות שלך אינן מוצפנות. לחץ כאן כדי לאפשר OTR."\n         ],\n         "Your messages are encrypted, but your contact has not been verified.": [\n            null,\n            "ההודעות שלך מוצפנות כעת, אך האיש קשר שלך טרם אומת."\n         ],\n         "Your messages are encrypted and your contact verified.": [\n            null,\n            "ההודעות שלך מוצפנות כעת והאיש קשר שלך אומת."\n         ],\n         "Your contact has closed their end of the private session, you should do the same": [\n            null,\n            "האיש קשר סגר את קצה ישיבה פרטית שלהם, עליך לעשות זאת גם כן"\n         ],\n         "Clear all messages": [\n            null,\n            "טהר את כל ההודעות"\n         ],\n         "End encrypted conversation": [\n            null,\n            "סיים ישיבה מוצפנת"\n         ],\n         "Insert a smiley": [\n            null,\n            "הכנס סמיילי"\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            "רענן ישיבה מוצפנת"\n         ],\n         "Start a call": [\n            null,\n            "התחל שיחה"\n         ],\n         "Start encrypted conversation": [\n            null,\n            "התחל ישיבה מוצפנת"\n         ],\n         "Verify with fingerprints": [\n            null,\n            "אמת בעזרת טביעות אצבע"\n         ],\n         "Verify with SMP": [\n            null,\n            "אמת בעזרת SMP"\n         ],\n         "What\'s this?": [\n            null,\n            "מה זה?"\n         ],\n         "Online": [\n            null,\n            "מקוון"\n         ],\n         "Busy": [\n            null,\n            "עסוק"\n         ],\n         "Away": [\n            null,\n            "נעדר"\n         ],\n         "Offline": [\n            null,\n            "לא מקוון"\n         ],\n         "Log out": [\n            null,\n            "התנתקות"\n         ],\n         "Contact name": [\n            null,\n            "שם איש קשר"\n         ],\n         "Search": [\n            null,\n            "חיפוש"\n         ],\n         "e.g. user@example.com": [\n            null,\n            "למשל user@example.com"\n         ],\n         "Add": [\n            null,\n            "הוסף"\n         ],\n         "Click to add new chat contacts": [\n            null,\n            "לחץ כדי להוסיף אנשי קשר שיחה חדשים"\n         ],\n         "Add a contact": [\n            null,\n            "הוסף איש קשר"\n         ],\n         "No users found": [\n            null,\n            "לא נמצאו משתמשים"\n         ],\n         "Click to add as a chat contact": [\n            null,\n            "לחץ כדי להוסיף בתור איש קשר שיחה"\n         ],\n         "Room name": [\n            null,\n            "שם חדר"\n         ],\n         "Nickname": [\n            null,\n            "שם כינוי"\n         ],\n         "Server": [\n            null,\n            "שרת"\n         ],\n         "Join Room": [\n            null,\n            "הצטרף לחדר"\n         ],\n         "Show rooms": [\n            null,\n            "הצג חדרים"\n         ],\n         "Rooms": [\n            null,\n            "חדרים"\n         ],\n         "No rooms on %1$s": [\n            null,\n            "אין חדרים על %1$s"\n         ],\n         "Rooms on %1$s": [\n            null,\n            "חדרים על %1$s"\n         ],\n         "Click to open this room": [\n            null,\n            "לחץ כדי לפתוח את חדר זה"\n         ],\n         "Show more information on this room": [\n            null,\n            "הצג עוד מידע אודות חדר זה"\n         ],\n         "Description:": [\n            null,\n            "תיאור:"\n         ],\n         "Occupants:": [\n            null,\n            "נוכחים:"\n         ],\n         "Features:": [\n            null,\n            "תכונות:"\n         ],\n         "Requires authentication": [\n            null,\n            "מצריך אישור"\n         ],\n         "Hidden": [\n            null,\n            "נסתר"\n         ],\n         "Requires an invitation": [\n            null,\n            "מצריך הזמנה"\n         ],\n         "Moderated": [\n            null,\n            "מבוקר"\n         ],\n         "Non-anonymous": [\n            null,\n            "לא-אנונימי"\n         ],\n         "Open room": [\n            null,\n            "חדר פתוח"\n         ],\n         "Permanent room": [\n            null,\n            "חדר צמיתה"\n         ],\n         "Public": [\n            null,\n            "פומבי"\n         ],\n         "Semi-anonymous": [\n            null,\n            "אנונימי-למחצה"\n         ],\n         "Temporary room": [\n            null,\n            "חדר זמני"\n         ],\n         "Unmoderated": [\n            null,\n            "לא מבוקר"\n         ],\n         "This user is a moderator": [\n            null,\n            "משתמש זה הינו אחראי"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "משתמש זה מסוגל לשלוח הודעות בתוך חדר זה"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "משתמש זה ﬥﬡ מסוגל לשלוח הודעות בתוך חדר זה"\n         ],\n         "Invite...": [\n            null,\n            "הזמנה..."\n         ],\n         "Occupants": [\n            null,\n            "נוכחים"\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            "אתה עומד להזמין את %1$s לחדר שיחה \\"%2$s\\". "\n         ],\n         "You may optionally include a message, explaining the reason for the invitation.": [\n            null,\n            "באפשרותך להכליל הודעה, אשר  מסבירה את הסיבה להזמנה."\n         ],\n         "Message": [\n            null,\n            "הודעה"\n         ],\n         "Error: could not execute the command": [\n            null,\n            "שגיאה: לא היתה אפשרות לבצע פקודה"\n         ],\n         "Error: the \\"": [\n            null,\n            ""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            "שנה סינוף משתמש למנהל"\n         ],\n         "Ban user from room": [\n            null,\n            "אסור משתמש מתוך חדר"\n         ],\n         "Kick user from room": [\n            null,\n            "בעט משתמש מתוך חדר"\n         ],\n         "Write in 3rd person": [\n            null,\n            "כתוב בגוף שלישי"\n         ],\n         "Grant membership to a user": [\n            null,\n            "הענק חברות למשתמש"\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            "הסר יכולת משתמש לפרסם הודעות"\n         ],\n         "Change your nickname": [\n            null,\n            "שנה את השם כינוי שלך"\n         ],\n         "Grant moderator role to user": [\n            null,\n            "הענק תפקיד אחראי למשתמש"\n         ],\n         "Grant ownership of this room": [\n            null,\n            "הענק בעלות על חדר זה"\n         ],\n         "Revoke user\'s membership": [\n            null,\n            "שלול חברות משתמש"\n         ],\n         "Set room topic": [\n            null,\n            "קבע נושא חדר"\n         ],\n         "Allow muted user to post messages": [\n            null,\n            "התר למשתמש מושתק לפרסם הודעות"\n         ],\n         "Save": [\n            null,\n            "שמור"\n         ],\n         "Cancel": [\n            null,\n            "ביטול"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "אירעה שגיאה במהלך ניסיון שמירת הטופס."\n         ],\n         "This chatroom requires a password": [\n            null,\n            "חדר שיחה זה מצריך סיסמה"\n         ],\n         "Password: ": [\n            null,\n            "סיסמה: "\n         ],\n         "Submit": [\n            null,\n            "שלח"\n         ],\n         "This room is not anonymous": [\n            null,\n            "חדר זה אינו אנונימי"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            "חדר זה כעת מציג חברים לא זמינים"\n         ],\n         "This room does not show unavailable members": [\n            null,\n            "חדר זה לא מציג חברים לא זמינים"\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            "תצורת חדר אשר לא-קשורה-בפרטיות שונתה"\n         ],\n         "Room logging is now enabled": [\n            null,\n            "יומן חדר הינו מופעל כעת"\n         ],\n         "Room logging is now disabled": [\n            null,\n            "יומן חדר הינו מנוטרל כעת"\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "חדר זה אינו אנונימי כעת"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "חדר זה הינו אנונימי-למחצה כעת"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "חדר זה הינו אנונימי-לחלוטין כעת"\n         ],\n         "A new room has been created": [\n            null,\n            "חדר חדש נוצר"\n         ],\n         "You have been banned from this room": [\n            null,\n            "נאסרת מתוך חדר זה"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "נבעטת מתוך חדר זה"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            "הוסרת מתוך חדר זה משום שינוי שיוך"\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            "הוסרת מתוך חדר זה משום שהחדר שונה לחברים-בלבד ואינך במעמד של חבר"\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            "הוסרת מתוך חדר זה משום ששירות שמ״מ (שיחה מרובת משתמשים) זה כעת מצוי בהליכי סגירה."\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "<strong>%1$s</strong> נאסר(ה)"\n         ],\n         "<strong>%1$s</strong>\'s nickname has changed": [\n            null,\n            "השם כינוי של<strong>%1$s</strong> השתנה"\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "<strong>%1$s</strong> נבעט(ה)"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            "<strong>%1$s</strong> הוסרה(ה) משום שינוי שיוך"\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            "<strong>%1$s</strong> הוסר(ה) משום אי הימצאות במסגרת מעמד של חבר"\n         ],\n         "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n            null,\n            "השם כינוי שלך שונה אוטומטית בשם: <strong>%1$s</strong>"\n         ],\n         "Your nickname has been changed to: <strong>%1$s</strong>": [\n            null,\n            "השם כינוי שלך שונה בשם: <strong>%1$s</strong>"\n         ],\n         "The reason given is: \\"": [\n            null,\n            "הסיבה שניתנה היא: \\""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "אינך ברשימת החברים של חדר זה"\n         ],\n         "No nickname was specified": [\n            null,\n            "לא צוין שום שם כינוי"\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "אין לך רשות ליצור חדרים חדשים"\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "השם כינוי שלך לא תואם את המדינויות של חדר זה"\n         ],\n         "Your nickname is already taken": [\n            null,\n            "השם כינוי שלך הינו תפוס"\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "חדר זה (עדיין) לא קיים"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "חדר זה הגיע לסף הנוכחים המרבי שלו"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            "נושא חדר זה נקבע על ידי %1$s אל: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            "%1$s הזמינך להצטרף לחדר שיחה: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            "%1$s הזמינך להצטרף לחדר שיחה: %2$s, והשאיר את הסיבה הבאה: \\"%3$s\\""\n         ],\n         "Click to restore this chat": [\n            null,\n            "לחץ כדי לשחזר את שיחה זו"\n         ],\n         "Minimized": [\n            null,\n            "ממוזער"\n         ],\n         "Click to remove this contact": [\n            null,\n            "לחץ כדי להסיר את איש קשר זה"\n         ],\n         "Click to accept this contact request": [\n            null,\n            "לחץ כדי לקבל את בקשת איש קשר זה"\n         ],\n         "Click to decline this contact request": [\n            null,\n            "לחץ כדי לסרב את בקשת איש קשר זה"\n         ],\n         "Click to chat with this contact": [\n            null,\n            "לחץ כדי לשוחח עם איש קשר זה"\n         ],\n         "Name": [\n            null,\n            "שם"\n         ],\n         "Are you sure you want to remove this contact?": [\n            null,\n            "האם אתה בטוח כי ברצונך להסיר את איש קשר זה?"\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            "מצטערים, היתה שגיאה במהלך ניסיון להסיר את "\n         ],\n         "Are you sure you want to decline this contact request?": [\n            null,\n            "האם אתה בטוח כי ברצונך לסרב את בקשת איש קשר זה?"\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            "מצטערים, היתה שגיאה במהלך ניסיון הוספת "\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            "לקוח זה לא מתיר הרשמות נוכחות"\n         ],\n         "Type to filter": [\n            null,\n            "הקלד כדי לסנן"\n         ],\n         "I am %1$s": [\n            null,\n            "מצבי כעת הינו %1$s"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "לחץ כאן כדי לכתוב הודעת מצב מותאמת"\n         ],\n         "Click to change your chat status": [\n            null,\n            "לחץ כדי לשנות את הודעת השיחה שלך"\n         ],\n         "Custom status": [\n            null,\n            "מצב מותאם"\n         ],\n         "online": [\n            null,\n            "מקוון"\n         ],\n         "busy": [\n            null,\n            "עסוק"\n         ],\n         "away for long": [\n            null,\n            "נעדר לזמן מה"\n         ],\n         "away": [\n            null,\n            "נעדר"\n         ],\n         "offline": [\n            null,\n            "לא מקוון"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            "שם מתחם של ספק XMPP שלך:"\n         ],\n         "Fetch registration form": [\n            null,\n            "משוך טופס הרשמה"\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            "טיפ: רשימה פומבית של ספקי XMPP הינה זמינה"\n         ],\n         "here": [\n            null,\n            "כאן"\n         ],\n         "Register": [\n            null,\n            "הירשם"\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            "מצטערים, הספק שניתן לא תומך ברישום חשבונות in band. אנא נסה עם ספק אחר."\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            "כעת מבקש טופס הרשמה מתוך שרת XMPP"\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            "משהו השתבש במהלך ביסוס חיבור עם \\"%1$s\\". האם אתה בטוח כי זה קיים?"\n         ],\n         "Now logging you in": [\n            null,\n            "כעת מחבר אותך פנימה"\n         ],\n         "Registered successfully": [\n            null,\n            "נרשם בהצלחה"\n         ],\n         "Return": [\n            null,\n            "חזור"\n         ],\n         "XMPP Username:": [\n            null,\n            "שם משתמש XMPP:"\n         ],\n         "Password:": [\n            null,\n            "סיסמה:"\n         ],\n         "Click here to log in anonymously": [\n            null,\n            "לחץ כאן כדי להתחבר באופן אנונימי"\n         ],\n         "Log In": [\n            null,\n            "כניסה"\n         ],\n         "user@server": [\n            null,\n            ""\n         ],\n         "password": [\n            null,\n            "סיסמה"\n         ],\n         "Sign in": [\n            null,\n            "התחברות"\n         ],\n         "Toggle chat": [\n            null,\n            "הפעל שיח"\n         ]\n      }\n   }\n}'}),define("text!hu",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "lang": "hu"\n         },\n         " e.g. conversejs.org": [\n            null,\n            ""\n         ],\n         "unencrypted": [\n            null,\n            "titkosítatlan"\n         ],\n         "unverified": [\n            null,\n            "nem hitelesített"\n         ],\n         "verified": [\n            null,\n            "hitelesített"\n         ],\n         "finished": [\n            null,\n            "befejezett"\n         ],\n         "This contact is busy": [\n            null,\n            "Elfoglalt"\n         ],\n         "This contact is online": [\n            null,\n            "Elérhető"\n         ],\n         "This contact is offline": [\n            null,\n            "Nincs bejelentkezve"\n         ],\n         "This contact is unavailable": [\n            null,\n            "Elérhetetlen"\n         ],\n         "This contact is away for an extended period": [\n            null,\n            "Hosszabb ideje távol"\n         ],\n         "This contact is away": [\n            null,\n            "Távol"\n         ],\n         "Click to hide these contacts": [\n            null,\n            "A csevegő partnerek elrejtése"\n         ],\n         "My contacts": [\n            null,\n            "Kapcsolataim"\n         ],\n         "Pending contacts": [\n            null,\n            "Függőben levő kapcsolatok"\n         ],\n         "Contact requests": [\n            null,\n            "Kapcsolatnak jelölés"\n         ],\n         "Ungrouped": [\n            null,\n            "Nincs csoportosítva"\n         ],\n         "Contacts": [\n            null,\n            "Kapcsolatok"\n         ],\n         "Groups": [\n            null,\n            "Csoportok"\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            ""\n         ],\n         "Error": [\n            null,\n            "Hiba"\n         ],\n         "Connecting": [\n            null,\n            "Kapcsolódás"\n         ],\n         "Authenticating": [\n            null,\n            "Azonosítás"\n         ],\n         "Authentication Failed": [\n            null,\n            "Azonosítási hiba"\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            "Titkosított kapcsolat újraépítése"\n         ],\n         "Generating private key.": [\n            null,\n            "Privát kulcs generálása"\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            "Előfordulhat, hogy a böngésző futása megáll."\n         ],\n         "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n            null,\n            "Azonosítási kérés érkezett: %1$s\\n\\nA csevegő partnere hitelesítést kér a következő kérdés megválaszolásával:\\n\\n%2$s"\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            "A felhasználó ellenőrzése sikertelen."\n         ],\n         "Exchanging private key with contact.": [\n            null,\n            "Privát kulcs cseréje..."\n         ],\n         "Minimize this chat box": [\n            null,\n            ""\n         ],\n         "Personal message": [\n            null,\n            "Személyes üzenet"\n         ],\n         "Are you sure you want to clear the messages from this room?": [\n            null,\n            "Törölni szeretné az üzeneteket ebből a szobából?"\n         ],\n         "me": [\n            null,\n            "Én"\n         ],\n         "is typing": [\n            null,\n            "gépel..."\n         ],\n         "has stopped typing": [\n            null,\n            "már nem gépel"\n         ],\n         "Show this menu": [\n            null,\n            "Mutasd a menüt"\n         ],\n         "Write in the third person": [\n            null,\n            "Írjon egyes szám harmadik személyben"\n         ],\n         "Remove messages": [\n            null,\n            "Üzenetek törlése"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            "Törölni szeretné az eddigi üzeneteket?"\n         ],\n         "Your message could not be sent": [\n            null,\n            "Az üzenet elküldése nem sikerült"\n         ],\n         "We received an unencrypted message": [\n            null,\n            "Titkosítatlan üzenet érkezett"\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            "Visszafejthetetlen titkosított üzenet érkezett"\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            "Újjlenyomatok megerősítése.\\n\\nAz Ön újjlenyomata,  %2$s: %3$s\\n\\nA csevegő partnere újjlenyomata, %1$s: %4$s\\n\\nAmennyiben az újjlenyomatok biztosan egyeznek, klikkeljen az OK, ellenkező esetben a Mégsem gombra."\n         ],\n         "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n            null,\n            "Elsőként egy biztonsági kérdést kell majd feltennie és megválaszolnia.\\n\\nMajd a csevegő partnerének is megjelenik ez a kérdés. Végül ha a válaszok azonosak lesznek (kis- nagybetű érzékeny), a partner hitelesítetté válik."\n         ],\n         "What is your security question?": [\n            null,\n            "Mi legyen a biztonsági kérdés?"\n         ],\n         "What is the answer to the security question?": [\n            null,\n            "Mi a válasz a biztonsági kérdésre?"\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            "Érvénytelen hitelesítési séma."\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            "Az üzenetek mostantól már nem titkosítottak"\n         ],\n         "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n            null,\n            "Az üzenetek titikosítva vannak, de a csevegő partnerét még nem hitelesítette."\n         ],\n         "Your contact\'s identify has been verified.": [\n            null,\n            "A csevegő partnere hitelesítve lett."\n         ],\n         "Your contact has ended encryption on their end, you should do the same.": [\n            null,\n            "A csevegő partnere kikapcsolta a titkosítást, így Önnek is ezt kellene tennie."\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            "Az üzenetek titkosítatlanok. OTR titkosítás aktiválása."\n         ],\n         "Your messages are encrypted, but your contact has not been verified.": [\n            null,\n            "Az üzenetek titikosítottak, de a csevegő partnere még nem hitelesített."\n         ],\n         "Your messages are encrypted and your contact verified.": [\n            null,\n            "Az üzenetek titikosítottak és a csevegő partnere hitelesített."\n         ],\n         "Your contact has closed their end of the private session, you should do the same": [\n            null,\n            "A csevegő partnere lezárta a magán beszélgetést"\n         ],\n         "Clear all messages": [\n            null,\n            "Üzenetek törlése"\n         ],\n         "End encrypted conversation": [\n            null,\n            "Titkosított kapcsolat vége"\n         ],\n         "Insert a smiley": [\n            null,\n            ""\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            "A titkosított kapcsolat frissítése"\n         ],\n         "Start a call": [\n            null,\n            "Hívás indítása"\n         ],\n         "Start encrypted conversation": [\n            null,\n            "Titkosított beszélgetés indítása"\n         ],\n         "Verify with fingerprints": [\n            null,\n            "Ellenőrzés újjlenyomattal"\n         ],\n         "Verify with SMP": [\n            null,\n            "Ellenőrzés SMP-vel"\n         ],\n         "What\'s this?": [\n            null,\n            "Mi ez?"\n         ],\n         "Online": [\n            null,\n            "Elérhető"\n         ],\n         "Busy": [\n            null,\n            "Foglalt"\n         ],\n         "Away": [\n            null,\n            "Távol"\n         ],\n         "Offline": [\n            null,\n            "Nem elérhető"\n         ],\n         "Log out": [\n            null,\n            "Kilépés"\n         ],\n         "Contact name": [\n            null,\n            "Partner neve"\n         ],\n         "Search": [\n            null,\n            "Keresés"\n         ],\n         "e.g. user@example.com": [\n            null,\n            ""\n         ],\n         "Add": [\n            null,\n            "Hozzáad"\n         ],\n         "Click to add new chat contacts": [\n            null,\n            "Új csevegő partner hozzáadása"\n         ],\n         "Add a contact": [\n            null,\n            "Új partner felvétele"\n         ],\n         "No users found": [\n            null,\n            "Nincs felhasználó"\n         ],\n         "Click to add as a chat contact": [\n            null,\n            "Felvétel a csevegő partnerek közé"\n         ],\n         "Room name": [\n            null,\n            "Szoba neve"\n         ],\n         "Nickname": [\n            null,\n            "Becenév"\n         ],\n         "Server": [\n            null,\n            "Szerver"\n         ],\n         "Show rooms": [\n            null,\n            "Létező szobák"\n         ],\n         "Rooms": [\n            null,\n            "Szobák"\n         ],\n         "No rooms on %1$s": [\n            null,\n            "Nincs csevegő szoba a(z) %1$s szerveren"\n         ],\n         "Rooms on %1$s": [\n            null,\n            "Csevegő szobák a(z) %1$s szerveren:"\n         ],\n         "Click to open this room": [\n            null,\n            "Belépés a csevegő szobába"\n         ],\n         "Show more information on this room": [\n            null,\n            "További információk a csevegő szobáról"\n         ],\n         "Description:": [\n            null,\n            "Leírás:"\n         ],\n         "Occupants:": [\n            null,\n            "Jelenlevők:"\n         ],\n         "Features:": [\n            null,\n            "Tulajdonságok:"\n         ],\n         "Requires authentication": [\n            null,\n            "Azonosítás szükséges"\n         ],\n         "Hidden": [\n            null,\n            "Rejtett"\n         ],\n         "Requires an invitation": [\n            null,\n            "Meghívás szükséges"\n         ],\n         "Moderated": [\n            null,\n            "Moderált"\n         ],\n         "Non-anonymous": [\n            null,\n            "NEM névtelen"\n         ],\n         "Open room": [\n            null,\n            "Nyitott szoba"\n         ],\n         "Permanent room": [\n            null,\n            "Állandó szoba"\n         ],\n         "Public": [\n            null,\n            "Nyílvános"\n         ],\n         "Semi-anonymous": [\n            null,\n            "Félig névtelen"\n         ],\n         "Temporary room": [\n            null,\n            "Ideiglenes szoba"\n         ],\n         "Unmoderated": [\n            null,\n            "Moderálatlan"\n         ],\n         "This user is a moderator": [\n            null,\n            "Ez a felhasználó egy moderátor"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "Ez a felhasználó küldhet üzenetet ebbe a szobába"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "Ez a felhasználó NEM küldhet üzenetet ebbe a szobába"\n         ],\n         "Invite...": [\n            null,\n            "Meghívás..."\n         ],\n         "Occupants": [\n            null,\n            "Jelenlevők"\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            "%1$s meghívott a \\"%2$s\\" csevegő szobába. "\n         ],\n         "Message": [\n            null,\n            "Üzenet"\n         ],\n         "Error: could not execute the command": [\n            null,\n            "Hiba: A parancs nem értelmezett"\n         ],\n         "Error: the \\"": [\n            null,\n            ""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            ""\n         ],\n         "Ban user from room": [\n            null,\n            "Felhasználó kitíltása a csevegő szobából"\n         ],\n         "Kick user from room": [\n            null,\n            "Felhasználó kiléptetése a csevegő szobából"\n         ],\n         "Write in 3rd person": [\n            null,\n            "Írjon egyes szám harmadik személyben"\n         ],\n         "Grant membership to a user": [\n            null,\n            ""\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            "A felhasználó nem küldhet üzeneteket"\n         ],\n         "Change your nickname": [\n            null,\n            "Becenév módosítása"\n         ],\n         "Grant moderator role to user": [\n            null,\n            ""\n         ],\n         "Revoke user\'s membership": [\n            null,\n            ""\n         ],\n         "Set room topic": [\n            null,\n            "Csevegőszoba téma beállítás"\n         ],\n         "Allow muted user to post messages": [\n            null,\n            "Elnémított felhasználók is küldhetnek üzeneteket"\n         ],\n         "Save": [\n            null,\n            "Ment"\n         ],\n         "Cancel": [\n            null,\n            "Mégsem"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "Hiba történt az adatok mentése közben."\n         ],\n         "This chatroom requires a password": [\n            null,\n            "A csevegő szoba belépéshez jelszó szükséges"\n         ],\n         "Password: ": [\n            null,\n            "Jelszó: "\n         ],\n         "Submit": [\n            null,\n            "Küldés"\n         ],\n         "This room is not anonymous": [\n            null,\n            "Ez a szoba NEM névtelen"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            "Ez a szoba mutatja az elérhetetlen tagokat"\n         ],\n         "This room does not show unavailable members": [\n            null,\n            "Ez a szoba nem mutatja az elérhetetlen tagokat"\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            "A szoba általános konfigurációja módosult"\n         ],\n         "Room logging is now enabled": [\n            null,\n            "A szobába a belépés lehetséges"\n         ],\n         "Room logging is now disabled": [\n            null,\n            "A szobába a belépés szünetel"\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "Ez a szoba most NEM névtelen"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "Ez a szoba most félig névtelen"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "Ez a szoba most teljesen névtelen"\n         ],\n         "A new room has been created": [\n            null,\n            "Létrejött egy új csevegő szoba"\n         ],\n         "You have been banned from this room": [\n            null,\n            "Ki lettél tíltva ebből a szobából"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "Ki lettél dobva ebből a szobából"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            "Taglista módosítás miatt kiléptettünk a csevegő szobából"\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            "Kiléptettünk a csevegő szobából, mert mostantól csak a taglistán szereplők lehetnek jelen"\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            "Kiléptettünk a csevegő szobából, mert a MUC (Multi-User Chat) szolgáltatás leállításra került."\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "A szobából kitíltva: <strong>%1$s</strong>"\n         ],\n         "<strong>%1$s</strong>\'s nickname has changed": [\n            null,\n            "<strong>%1$s</strong> beceneve módosult"\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "A szobából kidobva: <strong>%1$s</strong>"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            "Taglista módosítás miatt a szobából kiléptetve: <strong>%1$s</strong>"\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            "A taglistán nem szerepel így a szobából kiléptetve: <strong>%1$s</strong>"\n         ],\n         "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n            null,\n            "A beceneved módosításra került a következőre: <strong>%1$s</strong>"\n         ],\n         "Your nickname has been changed to: <strong>%1$s</strong>": [\n            null,\n            "A beceneved a következőre módosult: <strong>%1$s</strong>"\n         ],\n         "The reason given is: \\"": [\n            null,\n            "Az indok: \\""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "Nem szerepelsz a csevegő szoba taglistáján"\n         ],\n         "No nickname was specified": [\n            null,\n            "Nem lett megadva becenév"\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "Nem lehet új csevegő szobát létrehozni"\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "A beceneved ütközik a csevegő szoba szabályzataival"\n         ],\n         "Your nickname is already taken": [\n            null,\n            "A becenevedet már valaki használja"\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "Ez a szoba (még) nem létezik"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "Ez a csevegő szoba elérte a maximális jelenlévők számát"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            "A következő témát állította be %1$s: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            "%1$s meghívott a(z) %2$s csevegő szobába"\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            "%1$s meghívott a(z) %2$s csevegő szobába. Indok: \\"%3$s\\""\n         ],\n         "Click to restore this chat": [\n            null,\n            "A csevegés visszaállítása"\n         ],\n         "Minimized": [\n            null,\n            "Lezárva"\n         ],\n         "Click to remove this contact": [\n            null,\n            "Partner törlése"\n         ],\n         "Click to accept this contact request": [\n            null,\n            "Elogadása a partnerlistába történő felvételnek"\n         ],\n         "Click to decline this contact request": [\n            null,\n            "Megtagadása a partnerlistába történő felvételnek"\n         ],\n         "Click to chat with this contact": [\n            null,\n            "Csevegés indítása ezzel a partnerünkkel"\n         ],\n         "Name": [\n            null,\n            ""\n         ],\n         "Are you sure you want to remove this contact?": [\n            null,\n            "Valóban törölni szeretné a csevegő partnerét?"\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            ""\n         ],\n         "Are you sure you want to decline this contact request?": [\n            null,\n            "Valóban elutasítja ezt a kapcsolat felvételi kérést?"\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            ""\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            ""\n         ],\n         "Type to filter": [\n            null,\n            "Írjon be pár betűt"\n         ],\n         "I am %1$s": [\n            null,\n            "%1$s vagyok"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "Egyedi státusz üzenet írása"\n         ],\n         "Click to change your chat status": [\n            null,\n            "Saját státusz beállítása"\n         ],\n         "Custom status": [\n            null,\n            "Egyedi státusz"\n         ],\n         "online": [\n            null,\n            "Elérhető"\n         ],\n         "busy": [\n            null,\n            "Elfoglalt"\n         ],\n         "away for long": [\n            null,\n            "Hosszú ideje távol"\n         ],\n         "away": [\n            null,\n            "Távol"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            "Az XMPP szolgáltató domain neve:"\n         ],\n         "Fetch registration form": [\n            null,\n            "Regisztrációs űrlap"\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            "Tipp: A nyílvános XMPP szolgáltatókról egy lista elérhető"\n         ],\n         "here": [\n            null,\n            "itt"\n         ],\n         "Register": [\n            null,\n            "Regisztráció"\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            "A megadott szolgáltató nem támogatja a csevegőn keresztüli regisztrációt. Próbáljon meg egy másikat."\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            "Regisztrációs űrlap lekérése az XMPP szervertől"\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            "Hiba történt a(z) \\"%1$s\\" kapcsolódásakor. Biztos benne, hogy ez létező kiszolgáló?"\n         ],\n         "Now logging you in": [\n            null,\n            "Belépés..."\n         ],\n         "Registered successfully": [\n            null,\n            "Sikeres regisztráció"\n         ],\n         "Return": [\n            null,\n            "Visza"\n         ],\n         "XMPP Username:": [\n            null,\n            "XMPP/Jabber azonosító:"\n         ],\n         "Password:": [\n            null,\n            "Jelszó:"\n         ],\n         "Log In": [\n            null,\n            "Belépés"\n         ],\n         "user@server": [\n            null,\n            ""\n         ],\n         "Sign in": [\n            null,\n            "Belépés"\n         ],\n         "Toggle chat": [\n            null,\n            "Csevegő ablak"\n         ]\n      }\n   }\n}'}),define("text!id",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "lang": "id"\n         },\n         " e.g. conversejs.org": [\n            null,\n            ""\n         ],\n         "unencrypted": [\n            null,\n            "tak dienkripsi"\n         ],\n         "unverified": [\n            null,\n            "tak diverifikasi"\n         ],\n         "verified": [\n            null,\n            "diverifikasi"\n         ],\n         "finished": [\n            null,\n            "selesai"\n         ],\n         "This contact is busy": [\n            null,\n            "Teman ini sedang sibuk"\n         ],\n         "This contact is online": [\n            null,\n            "Teman ini terhubung"\n         ],\n         "This contact is offline": [\n            null,\n            "Teman ini tidak terhubung"\n         ],\n         "This contact is unavailable": [\n            null,\n            "Teman ini tidak tersedia"\n         ],\n         "This contact is away for an extended period": [\n            null,\n            "Teman ini tidak di tempat untuk waktu yang lama"\n         ],\n         "This contact is away": [\n            null,\n            "Teman ini tidak di tempat"\n         ],\n         "My contacts": [\n            null,\n            "Teman saya"\n         ],\n         "Pending contacts": [\n            null,\n            "Teman yang menunggu"\n         ],\n         "Contact requests": [\n            null,\n            "Permintaan pertemanan"\n         ],\n         "Ungrouped": [\n            null,\n            ""\n         ],\n         "Contacts": [\n            null,\n            "Teman"\n         ],\n         "Groups": [\n            null,\n            ""\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            ""\n         ],\n         "Error": [\n            null,\n            "Kesalahan"\n         ],\n         "Connecting": [\n            null,\n            "Menyambung"\n         ],\n         "Authenticating": [\n            null,\n            "Melakukan otentikasi"\n         ],\n         "Authentication Failed": [\n            null,\n            "Otentikasi gagal"\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            "Menyambung kembali sesi terenkripsi"\n         ],\n         "Generating private key.": [\n            null,\n            ""\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            ""\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            "Tak dapat melakukan verifikasi identitas pengguna ini."\n         ],\n         "Exchanging private key with contact.": [\n            null,\n            ""\n         ],\n         "Minimize this chat box": [\n            null,\n            ""\n         ],\n         "Personal message": [\n            null,\n            "Pesan pribadi"\n         ],\n         "me": [\n            null,\n            "saya"\n         ],\n         "is typing": [\n            null,\n            ""\n         ],\n         "has stopped typing": [\n            null,\n            ""\n         ],\n         "Show this menu": [\n            null,\n            "Tampilkan menu ini"\n         ],\n         "Write in the third person": [\n            null,\n            "Tulis ini menggunakan bahasa pihak ketiga"\n         ],\n         "Remove messages": [\n            null,\n            "Hapus pesan"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            ""\n         ],\n         "Your message could not be sent": [\n            null,\n            "Pesan anda tak dapat dikirim"\n         ],\n         "We received an unencrypted message": [\n            null,\n            "Kami menerima pesan terenkripsi"\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            "Kami menerima pesan terenkripsi yang gagal dibaca"\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            "Ini adalah sidik jari anda, konfirmasikan bersama mereka dengan %1$s, di luar percakapan ini.\\n\\nSidik jari untuk anda, %2$s: %3$s\\n\\nSidik jari untuk %1$s: %4$s\\n\\nJika anda bisa mengkonfirmasi sidik jadi cocok, klik Lanjutkan, jika tidak klik Batal."\n         ],\n         "What is your security question?": [\n            null,\n            "Apakah pertanyaan keamanan anda?"\n         ],\n         "What is the answer to the security question?": [\n            null,\n            "Apa jawaban dari pertanyaan keamanan tersebut?"\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            "Skema otentikasi salah"\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            "Pesan anda tidak lagi terenkripsi"\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            "Pesan anda tak terenkripsi. Klik di sini untuk menyalakan enkripsi OTR."\n         ],\n         "End encrypted conversation": [\n            null,\n            "Sudahi percakapan terenkripsi"\n         ],\n         "Insert a smiley": [\n            null,\n            ""\n         ],\n         "Hide the list of occupants": [\n            null,\n            ""\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            "Setel ulang percakapan terenkripsi"\n         ],\n         "Start a call": [\n            null,\n            ""\n         ],\n         "Start encrypted conversation": [\n            null,\n            "Mulai sesi terenkripsi"\n         ],\n         "Verify with fingerprints": [\n            null,\n            "Verifikasi menggunakan sidik jari"\n         ],\n         "Verify with SMP": [\n            null,\n            "Verifikasi menggunakan SMP"\n         ],\n         "What\'s this?": [\n            null,\n            "Apakah ini?"\n         ],\n         "Online": [\n            null,\n            "Terhubung"\n         ],\n         "Busy": [\n            null,\n            "Sibuk"\n         ],\n         "Away": [\n            null,\n            "Pergi"\n         ],\n         "Offline": [\n            null,\n            "Tak Terhubung"\n         ],\n         "Contact name": [\n            null,\n            "Nama teman"\n         ],\n         "Search": [\n            null,\n            "Cari"\n         ],\n         "e.g. user@example.com": [\n            null,\n            ""\n         ],\n         "Add": [\n            null,\n            "Tambah"\n         ],\n         "Click to add new chat contacts": [\n            null,\n            "Klik untuk menambahkan teman baru"\n         ],\n         "Add a contact": [\n            null,\n            "Tambah teman"\n         ],\n         "No users found": [\n            null,\n            "Pengguna tak ditemukan"\n         ],\n         "Click to add as a chat contact": [\n            null,\n            "Klik untuk menambahkan sebagai teman"\n         ],\n         "Room name": [\n            null,\n            "Nama ruangan"\n         ],\n         "Nickname": [\n            null,\n            "Nama panggilan"\n         ],\n         "Server": [\n            null,\n            "Server"\n         ],\n         "Show rooms": [\n            null,\n            "Perlihatkan ruangan"\n         ],\n         "Rooms": [\n            null,\n            "Ruangan"\n         ],\n         "No rooms on %1$s": [\n            null,\n            "Tak ada ruangan di %1$s"\n         ],\n         "Rooms on %1$s": [\n            null,\n            "Ruangan di %1$s"\n         ],\n         "Click to open this room": [\n            null,\n            "Klik untuk membuka ruangan ini"\n         ],\n         "Show more information on this room": [\n            null,\n            "Tampilkan informasi ruangan ini"\n         ],\n         "Description:": [\n            null,\n            "Keterangan:"\n         ],\n         "Occupants:": [\n            null,\n            "Penghuni:"\n         ],\n         "Features:": [\n            null,\n            "Fitur:"\n         ],\n         "Requires authentication": [\n            null,\n            "Membutuhkan otentikasi"\n         ],\n         "Hidden": [\n            null,\n            "Tersembunyi"\n         ],\n         "Requires an invitation": [\n            null,\n            "Membutuhkan undangan"\n         ],\n         "Moderated": [\n            null,\n            "Dimoderasi"\n         ],\n         "Non-anonymous": [\n            null,\n            "Tidak anonim"\n         ],\n         "Open room": [\n            null,\n            "Ruangan terbuka"\n         ],\n         "Permanent room": [\n            null,\n            "Ruangan permanen"\n         ],\n         "Public": [\n            null,\n            "Umum"\n         ],\n         "Semi-anonymous": [\n            null,\n            "Semi-anonim"\n         ],\n         "Temporary room": [\n            null,\n            "Ruangan sementara"\n         ],\n         "Unmoderated": [\n            null,\n            "Tak dimoderasi"\n         ],\n         "This user is a moderator": [\n            null,\n            "Pengguna ini adalah moderator"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "Pengguna ini dapat mengirim pesan di ruangan ini"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "Pengguna ini tak dapat mengirim pesan di ruangan ini"\n         ],\n         "Invite...": [\n            null,\n            ""\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            ""\n         ],\n         "You may optionally include a message, explaining the reason for the invitation.": [\n            null,\n            ""\n         ],\n         "Message": [\n            null,\n            "Pesan"\n         ],\n         "Error: could not execute the command": [\n            null,\n            ""\n         ],\n         "Error: the \\"": [\n            null,\n            ""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            ""\n         ],\n         "Change user role to occupant": [\n            null,\n            ""\n         ],\n         "Grant membership to a user": [\n            null,\n            ""\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            ""\n         ],\n         "Change your nickname": [\n            null,\n            ""\n         ],\n         "Grant moderator role to user": [\n            null,\n            ""\n         ],\n         "Revoke user\'s membership": [\n            null,\n            ""\n         ],\n         "Allow muted user to post messages": [\n            null,\n            ""\n         ],\n         "Save": [\n            null,\n            "Simpan"\n         ],\n         "Cancel": [\n            null,\n            "Batal"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "Kesalahan terjadi saat menyimpan formulir ini."\n         ],\n         "This chatroom requires a password": [\n            null,\n            "Ruangan ini membutuhkan kata sandi"\n         ],\n         "Password: ": [\n            null,\n            "Kata sandi: "\n         ],\n         "Submit": [\n            null,\n            "Kirim"\n         ],\n         "This room is not anonymous": [\n            null,\n            "Ruangan ini tidak anonim"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            "Ruangan ini menampilkan anggota yang tak tersedia"\n         ],\n         "This room does not show unavailable members": [\n            null,\n            "Ruangan ini tidak menampilkan anggota yang tak tersedia"\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            "Konfigurasi ruangan yang tak berhubungan dengan privasi telah diubah"\n         ],\n         "Room logging is now enabled": [\n            null,\n            "Pencatatan di ruangan ini sekarang dinyalakan"\n         ],\n         "Room logging is now disabled": [\n            null,\n            "Pencatatan di ruangan ini sekarang dimatikan"\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "Ruangan ini sekarang tak-anonim"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "Ruangan ini sekarang semi-anonim"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "Ruangan ini sekarang anonim"\n         ],\n         "A new room has been created": [\n            null,\n            "Ruangan baru telah dibuat"\n         ],\n         "You have been banned from this room": [\n            null,\n            "Anda telah dicekal dari ruangan ini"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "Anda telah ditendang dari ruangan ini"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            "Anda telah dihapus dari ruangan ini karena perubahan afiliasi"\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            "Anda telah dihapus dari ruangan ini karena ruangan ini hanya terbuka untuk anggota dan anda bukan anggota"\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            "Anda telah dihapus dari ruangan ini karena layanan MUC (Multi-user chat) telah dimatikan."\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "<strong>%1$s</strong> telah dicekal"\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "<strong>%1$s</strong> telah ditendang keluar"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            "<strong>%1$s</strong> telah dihapus karena perubahan afiliasi"\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            "<strong>%1$s</strong> telah dihapus karena bukan anggota"\n         ],\n         "The reason given is: \\"": [\n            null,\n            ""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "Anda bukan anggota dari ruangan ini"\n         ],\n         "No nickname was specified": [\n            null,\n            "Nama panggilan belum ditentukan"\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "Anda tak diizinkan untuk membuat ruangan baru"\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "Nama panggilan anda tidak sesuai aturan ruangan ini"\n         ],\n         "Your nickname is already taken": [\n            null,\n            "Nama panggilan anda telah digunakan orang lain"\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "Ruangan ini belum dibuat"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "Ruangan ini telah mencapai jumlah penghuni maksimum"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            "Topik diganti oleh %1$s menjadi: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            ""\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            ""\n         ],\n         "Minimized": [\n            null,\n            ""\n         ],\n         "Click to remove this contact": [\n            null,\n            "Klik untuk menghapus teman ini"\n         ],\n         "Click to chat with this contact": [\n            null,\n            "Klik untuk mulai perbinjangan dengan teman ini"\n         ],\n         "Name": [\n            null,\n            ""\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            ""\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            ""\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            ""\n         ],\n         "Type to filter": [\n            null,\n            ""\n         ],\n         "I am %1$s": [\n            null,\n            "Saya %1$s"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "Klik untuk menulis status kustom"\n         ],\n         "Click to change your chat status": [\n            null,\n            "Klik untuk mengganti status"\n         ],\n         "Custom status": [\n            null,\n            "Status kustom"\n         ],\n         "online": [\n            null,\n            "terhubung"\n         ],\n         "busy": [\n            null,\n            "sibuk"\n         ],\n         "away for long": [\n            null,\n            "lama tak di tempat"\n         ],\n         "away": [\n            null,\n            "tak di tempat"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            ""\n         ],\n         "Fetch registration form": [\n            null,\n            ""\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            ""\n         ],\n         "here": [\n            null,\n            ""\n         ],\n         "Register": [\n            null,\n            ""\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            ""\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            ""\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            ""\n         ],\n         "Now logging you in": [\n            null,\n            ""\n         ],\n         "Registered successfully": [\n            null,\n            ""\n         ],\n         "Return": [\n            null,\n            ""\n         ],\n         "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n            null,\n            ""\n         ],\n         "Password:": [\n            null,\n            "Kata sandi:"\n         ],\n         "Log In": [\n            null,\n            "Masuk"\n         ],\n         "user@server": [\n            null,\n            ""\n         ],\n         "Sign in": [\n            null,\n            "Masuk"\n         ],\n         "Toggle chat": [\n            null,\n            ""\n         ]\n      }\n   }\n}'}),define("text!it",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "plural_forms": "nplurals=2; plural=(n != 1);",\n            "lang": "it"\n         },\n         " e.g. conversejs.org": [\n            null,\n            "es. conversejs.org"\n         ],\n         "unencrypted": [\n            null,\n            "non criptato"\n         ],\n         "unverified": [\n            null,\n            "non verificato"\n         ],\n         "verified": [\n            null,\n            "verificato"\n         ],\n         "finished": [\n            null,\n            "finito"\n         ],\n         "This contact is busy": [\n            null,\n            "Questo contatto è occupato"\n         ],\n         "This contact is online": [\n            null,\n            "Questo contatto è online"\n         ],\n         "This contact is offline": [\n            null,\n            "Questo contatto è offline"\n         ],\n         "This contact is unavailable": [\n            null,\n            "Questo contatto non è disponibile"\n         ],\n         "This contact is away for an extended period": [\n            null,\n            "Il contatto è away da un lungo periodo"\n         ],\n         "This contact is away": [\n            null,\n            "Questo contatto è away"\n         ],\n         "Click to hide these contacts": [\n            null,\n            "Clicca per nascondere questi contatti"\n         ],\n         "My contacts": [\n            null,\n            "I miei contatti"\n         ],\n         "Pending contacts": [\n            null,\n            "Contatti in attesa"\n         ],\n         "Contact requests": [\n            null,\n            "Richieste dei contatti"\n         ],\n         "Ungrouped": [\n            null,\n            "Senza Gruppo"\n         ],\n         "Contacts": [\n            null,\n            "Contatti"\n         ],\n         "Groups": [\n            null,\n            "Gruppi"\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            "Attendi riconversione in 5 secondi"\n         ],\n         "Error": [\n            null,\n            "Errore"\n         ],\n         "Connecting": [\n            null,\n            "Connessione in corso"\n         ],\n         "Authenticating": [\n            null,\n            "Autenticazione in corso"\n         ],\n         "Authentication Failed": [\n            null,\n            "Autenticazione fallita"\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            ""\n         ],\n         "Generating private key.": [\n            null,\n            ""\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            ""\n         ],\n         "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n            null,\n            ""\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            ""\n         ],\n         "Exchanging private key with contact.": [\n            null,\n            ""\n         ],\n         "Minimize this chat box": [\n            null,\n            ""\n         ],\n         "Personal message": [\n            null,\n            "Messaggio personale"\n         ],\n         "Are you sure you want to clear the messages from this room?": [\n            null,\n            "Sei sicuro di voler pulire i messaggi da questa stanza?"\n         ],\n         "me": [\n            null,\n            "me"\n         ],\n         "is typing": [\n            null,\n            "sta scrivendo"\n         ],\n         "has stopped typing": [\n            null,\n            "ha smesso di scrivere"\n         ],\n         "has gone away": [\n            null,\n            ""\n         ],\n         "Show this menu": [\n            null,\n            "Mostra questo menu"\n         ],\n         "Write in the third person": [\n            null,\n            "Scrivi in terza persona"\n         ],\n         "Remove messages": [\n            null,\n            "Rimuovi messaggi"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            ""\n         ],\n         "Your message could not be sent": [\n            null,\n            ""\n         ],\n         "We received an unencrypted message": [\n            null,\n            ""\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            ""\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            ""\n         ],\n         "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n            null,\n            ""\n         ],\n         "What is your security question?": [\n            null,\n            ""\n         ],\n         "What is the answer to the security question?": [\n            null,\n            ""\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            ""\n         ],\n         "has gone offline": [\n            null,\n            ""\n         ],\n         "is busy": [\n            null,\n            "è occupato"\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            ""\n         ],\n         "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n            null,\n            ""\n         ],\n         "Your contact\'s identify has been verified.": [\n            null,\n            ""\n         ],\n         "Your contact has ended encryption on their end, you should do the same.": [\n            null,\n            ""\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            ""\n         ],\n         "Your messages are encrypted, but your contact has not been verified.": [\n            null,\n            ""\n         ],\n         "Your messages are encrypted and your contact verified.": [\n            null,\n            ""\n         ],\n         "Your contact has closed their end of the private session, you should do the same": [\n            null,\n            ""\n         ],\n         "Clear all messages": [\n            null,\n            "Pulisci tutti i messaggi"\n         ],\n         "End encrypted conversation": [\n            null,\n            ""\n         ],\n         "Insert a smiley": [\n            null,\n            ""\n         ],\n         "Hide the list of occupants": [\n            null,\n            ""\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            ""\n         ],\n         "Start a call": [\n            null,\n            ""\n         ],\n         "Start encrypted conversation": [\n            null,\n            ""\n         ],\n         "Verify with fingerprints": [\n            null,\n            ""\n         ],\n         "Verify with SMP": [\n            null,\n            ""\n         ],\n         "What\'s this?": [\n            null,\n            ""\n         ],\n         "Online": [\n            null,\n            "In linea"\n         ],\n         "Busy": [\n            null,\n            "Occupato"\n         ],\n         "Away": [\n            null,\n            "Assente"\n         ],\n         "Offline": [\n            null,\n            "Non in linea"\n         ],\n         "Log out": [\n            null,\n            "Logo out"\n         ],\n         "Contact name": [\n            null,\n            "Nome del contatto"\n         ],\n         "Search": [\n            null,\n            "Cerca"\n         ],\n         "e.g. user@example.com": [\n            null,\n            "es. user@example.com"\n         ],\n         "Add": [\n            null,\n            "Aggiungi"\n         ],\n         "Click to add new chat contacts": [\n            null,\n            "Clicca per aggiungere nuovi contatti alla chat"\n         ],\n         "Add a contact": [\n            null,\n            "Aggiungi contatti"\n         ],\n         "No users found": [\n            null,\n            "Nessun utente trovato"\n         ],\n         "Click to add as a chat contact": [\n            null,\n            "Clicca per aggiungere il contatto alla chat"\n         ],\n         "Room name": [\n            null,\n            "Nome stanza"\n         ],\n         "Nickname": [\n            null,\n            "Soprannome"\n         ],\n         "Server": [\n            null,\n            "Server"\n         ],\n         "Join Room": [\n            null,\n            "Entra nella Stanza"\n         ],\n         "Show rooms": [\n            null,\n            "Mostra stanze"\n         ],\n         "Rooms": [\n            null,\n            "Stanze"\n         ],\n         "No rooms on %1$s": [\n            null,\n            "Nessuna stanza su %1$s"\n         ],\n         "Rooms on %1$s": [\n            null,\n            "Stanze su %1$s"\n         ],\n         "Click to open this room": [\n            null,\n            "Clicca per aprire questa stanza"\n         ],\n         "Show more information on this room": [\n            null,\n            "Mostra più informazioni su questa stanza"\n         ],\n         "Description:": [\n            null,\n            "Descrizione:"\n         ],\n         "Occupants:": [\n            null,\n            "Utenti presenti:"\n         ],\n         "Features:": [\n            null,\n            "Funzionalità:"\n         ],\n         "Requires authentication": [\n            null,\n            "Richiede autenticazione"\n         ],\n         "Hidden": [\n            null,\n            "Nascosta"\n         ],\n         "Requires an invitation": [\n            null,\n            "Richiede un invito"\n         ],\n         "Moderated": [\n            null,\n            "Moderata"\n         ],\n         "Non-anonymous": [\n            null,\n            "Non-anonima"\n         ],\n         "Open room": [\n            null,\n            "Stanza aperta"\n         ],\n         "Permanent room": [\n            null,\n            "Stanza permanente"\n         ],\n         "Public": [\n            null,\n            "Pubblica"\n         ],\n         "Semi-anonymous": [\n            null,\n            "Semi-anonima"\n         ],\n         "Temporary room": [\n            null,\n            "Stanza temporanea"\n         ],\n         "Unmoderated": [\n            null,\n            "Non moderata"\n         ],\n         "This user is a moderator": [\n            null,\n            "Questo utente è un moderatore"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "Questo utente può inviare messaggi in questa stanza"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "Questo utente NON può inviare messaggi in questa stanza"\n         ],\n         "Invite...": [\n            null,\n            "Invita…"\n         ],\n         "Occupants": [\n            null,\n            "Occupanti"\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            ""\n         ],\n         "You may optionally include a message, explaining the reason for the invitation.": [\n            null,\n            ""\n         ],\n         "Message": [\n            null,\n            "Messaggio"\n         ],\n         "Error: could not execute the command": [\n            null,\n            ""\n         ],\n         "Error: the \\"": [\n            null,\n            ""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            ""\n         ],\n         "Ban user from room": [\n            null,\n            "Bandisci utente dalla stanza"\n         ],\n         "Change user role to occupant": [\n            null,\n            ""\n         ],\n         "Kick user from room": [\n            null,\n            "Espelli utente dalla stanza"\n         ],\n         "Write in 3rd person": [\n            null,\n            "Scrivi in terza persona"\n         ],\n         "Grant membership to a user": [\n            null,\n            ""\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            ""\n         ],\n         "Change your nickname": [\n            null,\n            ""\n         ],\n         "Grant moderator role to user": [\n            null,\n            ""\n         ],\n         "Revoke user\'s membership": [\n            null,\n            ""\n         ],\n         "Set room topic": [\n            null,\n            "Cambia oggetto della stanza"\n         ],\n         "Allow muted user to post messages": [\n            null,\n            ""\n         ],\n         "Save": [\n            null,\n            "Salva"\n         ],\n         "Cancel": [\n            null,\n            "Annulla"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "Errore durante il salvataggio del modulo"\n         ],\n         "This chatroom requires a password": [\n            null,\n            "Questa stanza richiede una password"\n         ],\n         "Password: ": [\n            null,\n            "Password: "\n         ],\n         "Submit": [\n            null,\n            "Invia"\n         ],\n         "This room is not anonymous": [\n            null,\n            "Questa stanza non è anonima"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            "Questa stanza mostra i membri non disponibili al momento"\n         ],\n         "This room does not show unavailable members": [\n            null,\n            "Questa stanza non mostra i membri non disponibili"\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            "Una configurazione della stanza non legata alla privacy è stata modificata"\n         ],\n         "Room logging is now enabled": [\n            null,\n            "La registrazione è abilitata nella stanza"\n         ],\n         "Room logging is now disabled": [\n            null,\n            "La registrazione è disabilitata nella stanza"\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "Questa stanza è non-anonima"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "Questa stanza è semi-anonima"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "Questa stanza è completamente-anonima"\n         ],\n         "A new room has been created": [\n            null,\n            "Una nuova stanza è stata creata"\n         ],\n         "You have been banned from this room": [\n            null,\n            "Sei stato bandito da questa stanza"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "Sei stato espulso da questa stanza"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            "Sei stato rimosso da questa stanza a causa di un cambio di affiliazione"\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            "Sei stato rimosso da questa stanza poiché ora la stanza accetta solo membri"\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            "Sei stato rimosso da questa stanza poiché il servizio MUC (Chat multi utente) è in fase di spegnimento"\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "<strong>%1$s</strong> è stato bandito"\n         ],\n         "<strong>%1$s</strong>\'s nickname has changed": [\n            null,\n            "<strong>%1$s</strong> nickname è cambiato"\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "<strong>%1$s</strong> è stato espulso"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            "<strong>%1$s</strong> è stato rimosso a causa di un cambio di affiliazione"\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            "<strong>%1$s</strong> è stato rimosso in quanto non membro"\n         ],\n         "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n            null,\n            "Il tuo nickname è stato cambiato automaticamente in: <strong>%1$s</strong>"\n         ],\n         "Your nickname has been changed to: <strong>%1$s</strong>": [\n            null,\n            "Il tuo nickname è stato cambiato: <strong>%1$s</strong>"\n         ],\n         "The reason given is: \\"": [\n            null,\n            ""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "Non sei nella lista dei membri di questa stanza"\n         ],\n         "No nickname was specified": [\n            null,\n            "Nessun soprannome specificato"\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "Non ti è permesso creare nuove stanze"\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "Il tuo soprannome non è conforme alle regole di questa stanza"\n         ],\n         "Your nickname is already taken": [\n            null,\n            "Il tuo soprannome è già utilizzato"\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "Questa stanza non esiste (per ora)"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "Questa stanza ha raggiunto il limite massimo di utenti"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            "Topic impostato da %1$s a: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            "%1$s ti ha invitato a partecipare a una chat room: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            "%1$s ti ha invitato a partecipare a una chat room: %2$s, e ha lasciato il seguente motivo: “%3$s”"\n         ],\n         "Click to restore this chat": [\n            null,\n            "Clicca per ripristinare questa chat"\n         ],\n         "Minimized": [\n            null,\n            "Ridotto"\n         ],\n         "Click to remove this contact": [\n            null,\n            "Clicca per rimuovere questo contatto"\n         ],\n         "Click to accept this contact request": [\n            null,\n            "Clicca per accettare questa richiesta di contatto"\n         ],\n         "Click to decline this contact request": [\n            null,\n            "Clicca per rifiutare questa richiesta di contatto"\n         ],\n         "Click to chat with this contact": [\n            null,\n            "Clicca per parlare con questo contatto"\n         ],\n         "Name": [\n            null,\n            "Nome"\n         ],\n         "Are you sure you want to remove this contact?": [\n            null,\n            "Sei sicuro di voler rimuovere questo contatto?"\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            "Si è verificato un errore durante il tentativo di rimozione"\n         ],\n         "Are you sure you want to decline this contact request?": [\n            null,\n            "Sei sicuro dirifiutare questa richiesta di contatto?"\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            "Si è verificato un errore durante il tentativo di aggiunta"\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            "Questo client non consente sottoscrizioni di presenza"\n         ],\n         "Type to filter": [\n            null,\n            ""\n         ],\n         "I am %1$s": [\n            null,\n            "Sono %1$s"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "Clicca qui per scrivere un messaggio di stato personalizzato"\n         ],\n         "Click to change your chat status": [\n            null,\n            "Clicca per cambiare il tuo stato"\n         ],\n         "Custom status": [\n            null,\n            "Stato personalizzato"\n         ],\n         "online": [\n            null,\n            "in linea"\n         ],\n         "busy": [\n            null,\n            "occupato"\n         ],\n         "away for long": [\n            null,\n            "assente da molto"\n         ],\n         "away": [\n            null,\n            "assente"\n         ],\n         "offline": [\n            null,\n            "offline"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            "Nome del dominio del provider XMPP:"\n         ],\n         "Fetch registration form": [\n            null,\n            "Recupero il modulo di registrazione"\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            "Suggerimento: È disponibile un elenco di provider XMPP pubblici"\n         ],\n         "here": [\n            null,\n            "qui"\n         ],\n         "Register": [\n            null,\n            "Registra"\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            "Siamo spiacenti, il provider specificato non supporta la registrazione di account. Si prega di provare con un altro provider."\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            "Sto richiedendo un modulo di registrazione al server XMPP"\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            "Qualcosa è andato storto durante la connessione con “%1$s”. Sei sicuro che esiste?"\n         ],\n         "Now logging you in": [\n            null,\n            ""\n         ],\n         "Registered successfully": [\n            null,\n            "Registrazione riuscita"\n         ],\n         "Return": [\n            null,\n            ""\n         ],\n         "XMPP Username:": [\n            null,\n            "XMPP Username:"\n         ],\n         "Password:": [\n            null,\n            "Password:"\n         ],\n         "Click here to log in anonymously": [\n            null,\n            "Clicca per entrare anonimo"\n         ],\n         "Log In": [\n            null,\n            "Entra"\n         ],\n         "user@server": [\n            null,\n            "user@server"\n         ],\n         "password": [\n            null,\n            "Password"\n         ],\n         "Sign in": [\n            null,\n            "Accesso"\n         ],\n         "Toggle chat": [\n            null,\n            "Attiva/disattiva chat"\n         ]\n      }\n   }\n}'}),define("text!ja",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "plural_forms": "nplurals=1; plural=0;",\n            "lang": "JA"\n         },\n         " e.g. conversejs.org": [\n            null,\n            ""\n         ],\n         "unencrypted": [\n            null,\n            "暗号化されていません"\n         ],\n         "unverified": [\n            null,\n            "検証されていません"\n         ],\n         "verified": [\n            null,\n            "検証されました"\n         ],\n         "finished": [\n            null,\n            "完了"\n         ],\n         "This contact is busy": [\n            null,\n            "この相手先は取り込み中です"\n         ],\n         "This contact is online": [\n            null,\n            "この相手先は在席しています"\n         ],\n         "This contact is offline": [\n            null,\n            "この相手先はオフラインです"\n         ],\n         "This contact is unavailable": [\n            null,\n            "この相手先は不通です"\n         ],\n         "This contact is away for an extended period": [\n            null,\n            "この相手先は不在です"\n         ],\n         "This contact is away": [\n            null,\n            "この相手先は離席中です"\n         ],\n         "My contacts": [\n            null,\n            "相手先一覧"\n         ],\n         "Pending contacts": [\n            null,\n            "保留中の相手先"\n         ],\n         "Contact requests": [\n            null,\n            "会話に呼び出し"\n         ],\n         "Ungrouped": [\n            null,\n            ""\n         ],\n         "Contacts": [\n            null,\n            "相手先"\n         ],\n         "Groups": [\n            null,\n            ""\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            ""\n         ],\n         "Error": [\n            null,\n            "エラー"\n         ],\n         "Connecting": [\n            null,\n            "接続中です"\n         ],\n         "Authenticating": [\n            null,\n            "認証中"\n         ],\n         "Authentication Failed": [\n            null,\n            "認証に失敗"\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            "暗号化セッションの再接続"\n         ],\n         "Generating private key.": [\n            null,\n            ""\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            ""\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            "このユーザーの本人性を検証できませんでした。"\n         ],\n         "Exchanging private key with contact.": [\n            null,\n            ""\n         ],\n         "Minimize this chat box": [\n            null,\n            ""\n         ],\n         "Personal message": [\n            null,\n            "私信"\n         ],\n         "me": [\n            null,\n            "私"\n         ],\n         "is typing": [\n            null,\n            ""\n         ],\n         "has stopped typing": [\n            null,\n            ""\n         ],\n         "Show this menu": [\n            null,\n            "このメニューを表示"\n         ],\n         "Write in the third person": [\n            null,\n            "第三者に書く"\n         ],\n         "Remove messages": [\n            null,\n            "メッセージを削除"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            ""\n         ],\n         "Your message could not be sent": [\n            null,\n            "メッセージを送信できませんでした"\n         ],\n         "We received an unencrypted message": [\n            null,\n            "暗号化されていないメッセージを受信しました"\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            "読めない暗号化メッセージを受信しました"\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            "これは鍵指紋です。チャット以外の方法でこれらを %1$s と確認してください。\\n\\nあなた %2$s の鍵指紋: %3$s\\n\\n%1$s の鍵指紋: %4$s\\n\\n確認して、鍵指紋が正しければ「OK」を、正しくなければ「キャンセル」をクリックしてください。"\n         ],\n         "What is your security question?": [\n            null,\n            "秘密の質問はなんですか?"\n         ],\n         "What is the answer to the security question?": [\n            null,\n            "秘密の質問の答はなんですか?"\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            "認証の方式が正しくありません"\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            "メッセージはもう暗号化されません"\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            "メッセージは暗号化されません。OTR 暗号化を有効にするにはここをクリックしてください。"\n         ],\n         "End encrypted conversation": [\n            null,\n            "暗号化された会話を終了"\n         ],\n         "Insert a smiley": [\n            null,\n            ""\n         ],\n         "Hide the list of occupants": [\n            null,\n            ""\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            "暗号化された会話をリフレッシュ"\n         ],\n         "Start a call": [\n            null,\n            ""\n         ],\n         "Start encrypted conversation": [\n            null,\n            "暗号化された会話を開始"\n         ],\n         "Verify with fingerprints": [\n            null,\n            "鍵指紋で検証"\n         ],\n         "Verify with SMP": [\n            null,\n            "SMP で検証"\n         ],\n         "What\'s this?": [\n            null,\n            "これは何ですか?"\n         ],\n         "Online": [\n            null,\n            "オンライン"\n         ],\n         "Busy": [\n            null,\n            "取り込み中"\n         ],\n         "Away": [\n            null,\n            "離席中"\n         ],\n         "Offline": [\n            null,\n            "オフライン"\n         ],\n         "Contact name": [\n            null,\n            "名前"\n         ],\n         "Search": [\n            null,\n            "検索"\n         ],\n         "e.g. user@example.com": [\n            null,\n            ""\n         ],\n         "Add": [\n            null,\n            "追加"\n         ],\n         "Click to add new chat contacts": [\n            null,\n            "クリックして新しいチャットの相手先を追加"\n         ],\n         "Add a contact": [\n            null,\n            "相手先を追加"\n         ],\n         "No users found": [\n            null,\n            "ユーザーが見つかりません"\n         ],\n         "Click to add as a chat contact": [\n            null,\n            "クリックしてチャットの相手先として追加"\n         ],\n         "Room name": [\n            null,\n            "談話室の名前"\n         ],\n         "Nickname": [\n            null,\n            "ニックネーム"\n         ],\n         "Server": [\n            null,\n            "サーバー"\n         ],\n         "Show rooms": [\n            null,\n            "談話室一覧を見る"\n         ],\n         "Rooms": [\n            null,\n            "談話室"\n         ],\n         "No rooms on %1$s": [\n            null,\n            "%1$s に談話室はありません"\n         ],\n         "Rooms on %1$s": [\n            null,\n            "%1$s の談話室一覧"\n         ],\n         "Click to open this room": [\n            null,\n            "クリックしてこの談話室を開く"\n         ],\n         "Show more information on this room": [\n            null,\n            "この談話室についての詳細を見る"\n         ],\n         "Description:": [\n            null,\n            "説明: "\n         ],\n         "Occupants:": [\n            null,\n            "入室者:"\n         ],\n         "Features:": [\n            null,\n            "特徴:"\n         ],\n         "Requires authentication": [\n            null,\n            "認証の要求"\n         ],\n         "Hidden": [\n            null,\n            "非表示"\n         ],\n         "Requires an invitation": [\n            null,\n            "招待の要求"\n         ],\n         "Moderated": [\n            null,\n            "発言制限"\n         ],\n         "Non-anonymous": [\n            null,\n            "非匿名"\n         ],\n         "Open room": [\n            null,\n            "開放談話室"\n         ],\n         "Permanent room": [\n            null,\n            "常設談話室"\n         ],\n         "Public": [\n            null,\n            "公開談話室"\n         ],\n         "Semi-anonymous": [\n            null,\n            "半匿名"\n         ],\n         "Temporary room": [\n            null,\n            "臨時談話室"\n         ],\n         "Unmoderated": [\n            null,\n            "発言制限なし"\n         ],\n         "This user is a moderator": [\n            null,\n            "このユーザーは司会者です"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "このユーザーはこの談話室で発言できます"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "このユーザーはこの談話室で発言できません"\n         ],\n         "Invite...": [\n            null,\n            ""\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            ""\n         ],\n         "You may optionally include a message, explaining the reason for the invitation.": [\n            null,\n            ""\n         ],\n         "Message": [\n            null,\n            "メッセージ"\n         ],\n         "Error: could not execute the command": [\n            null,\n            ""\n         ],\n         "Error: the \\"": [\n            null,\n            ""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            ""\n         ],\n         "Change user role to occupant": [\n            null,\n            ""\n         ],\n         "Grant membership to a user": [\n            null,\n            ""\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            ""\n         ],\n         "Change your nickname": [\n            null,\n            ""\n         ],\n         "Grant moderator role to user": [\n            null,\n            ""\n         ],\n         "Revoke user\'s membership": [\n            null,\n            ""\n         ],\n         "Allow muted user to post messages": [\n            null,\n            ""\n         ],\n         "Save": [\n            null,\n            "保存"\n         ],\n         "Cancel": [\n            null,\n            "キャンセル"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "フォームを保存する際にエラーが発生しました。"\n         ],\n         "This chatroom requires a password": [\n            null,\n            "この談話室にはパスワードが必要です"\n         ],\n         "Password: ": [\n            null,\n            "パスワード:"\n         ],\n         "Submit": [\n            null,\n            "送信"\n         ],\n         "This room is not anonymous": [\n            null,\n            "この談話室は非匿名です"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            "この談話室はメンバー以外にも見えます"\n         ],\n         "This room does not show unavailable members": [\n            null,\n            "この談話室はメンバー以外には見えません"\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            "談話室の設定(プライバシーに無関係)が変更されました"\n         ],\n         "Room logging is now enabled": [\n            null,\n            "談話室の記録を取りはじめます"\n         ],\n         "Room logging is now disabled": [\n            null,\n            "談話室の記録を止めます"\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "この談話室はただいま非匿名です"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "この談話室はただいま半匿名です"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "この談話室はただいま匿名です"\n         ],\n         "A new room has been created": [\n            null,\n            "新しい談話室が作成されました"\n         ],\n         "You have been banned from this room": [\n            null,\n            "この談話室から締め出されました"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "この談話室から蹴り出されました"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            "分掌の変更のため、この談話室から削除されました"\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            "談話室がメンバー制に変更されました。メンバーではないため、この談話室から削除されました"\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            "MUC(グループチャット)のサービスが停止したため、この談話室から削除されました。"\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "<strong>%1$s</strong> を締め出しました"\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "<strong>%1$s</strong> を蹴り出しました"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            "分掌の変更のため、<strong>%1$s</strong> を削除しました"\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            "メンバーでなくなったため、<strong>%1$s</strong> を削除しました"\n         ],\n         "The reason given is: \\"": [\n            null,\n            ""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "この談話室のメンバー一覧にいません"\n         ],\n         "No nickname was specified": [\n            null,\n            "ニックネームがありません"\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "新しい談話室を作成する権限がありません"\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "ニックネームがこの談話室のポリシーに従っていません"\n         ],\n         "Your nickname is already taken": [\n            null,\n            "ニックネームは既に使われています"\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "この談話室は存在しません"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "この談話室は入室者数の上限に達しています"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            "%1$s が話題を設定しました: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            ""\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            ""\n         ],\n         "Minimized": [\n            null,\n            ""\n         ],\n         "Click to remove this contact": [\n            null,\n            "クリックしてこの相手先を削除"\n         ],\n         "Click to chat with this contact": [\n            null,\n            "クリックしてこの相手先とチャット"\n         ],\n         "Name": [\n            null,\n            ""\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            ""\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            ""\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            ""\n         ],\n         "Type to filter": [\n            null,\n            ""\n         ],\n         "I am %1$s": [\n            null,\n            "私はいま %1$s"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "状況メッセージを入力するには、ここをクリック"\n         ],\n         "Click to change your chat status": [\n            null,\n            "クリックして、在席状況を変更"\n         ],\n         "Custom status": [\n            null,\n            "独自の在席状況"\n         ],\n         "online": [\n            null,\n            "在席"\n         ],\n         "busy": [\n            null,\n            "取り込み中"\n         ],\n         "away for long": [\n            null,\n            "不在"\n         ],\n         "away": [\n            null,\n            "離席中"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            ""\n         ],\n         "Fetch registration form": [\n            null,\n            ""\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            ""\n         ],\n         "here": [\n            null,\n            ""\n         ],\n         "Register": [\n            null,\n            ""\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            ""\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            ""\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            ""\n         ],\n         "Now logging you in": [\n            null,\n            ""\n         ],\n         "Registered successfully": [\n            null,\n            ""\n         ],\n         "Return": [\n            null,\n            ""\n         ],\n         "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n            null,\n            ""\n         ],\n         "Password:": [\n            null,\n            "パスワード:"\n         ],\n         "Log In": [\n            null,\n            "ログイン"\n         ],\n         "user@server": [\n            null,\n            ""\n         ],\n         "Sign in": [\n            null,\n            "サインイン"\n         ],\n         "Toggle chat": [\n            null,\n            ""\n         ]\n      }\n   }\n}'}),define("text!nb",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "plural_forms": "nplurals=2; plural=(n != 1);",\n            "lang": "nb"\n         },\n         " e.g. conversejs.org": [\n            null,\n            ""\n         ],\n         "unencrypted": [\n            null,\n            "ukryptertß"\n         ],\n         "unverified": [\n            null,\n            "uverifisert"\n         ],\n         "verified": [\n            null,\n            "verifisert"\n         ],\n         "finished": [\n            null,\n            "ferdig"\n         ],\n         "This contact is busy": [\n            null,\n            "Denne kontakten er opptatt"\n         ],\n         "This contact is online": [\n            null,\n            "Kontakten er pålogget"\n         ],\n         "This contact is offline": [\n            null,\n            "Kontakten er avlogget"\n         ],\n         "This contact is unavailable": [\n            null,\n            "Kontakten er utilgjengelig"\n         ],\n         "This contact is away for an extended period": [\n            null,\n            "Kontakten er borte for en lengre periode"\n         ],\n         "This contact is away": [\n            null,\n            "Kontakten er borte"\n         ],\n         "Click to hide these contacts": [\n            null,\n            "Klikk for å skjule disse kontaktene"\n         ],\n         "My contacts": [\n            null,\n            "Mine Kontakter"\n         ],\n         "Pending contacts": [\n            null,\n            "Kontakter som venter på godkjenning"\n         ],\n         "Contact requests": [\n            null,\n            "Kontaktforespørsler"\n         ],\n         "Ungrouped": [\n            null,\n            "Ugrupperte"\n         ],\n         "Contacts": [\n            null,\n            "Kontakter"\n         ],\n         "Groups": [\n            null,\n            "Grupper"\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            ""\n         ],\n         "Error": [\n            null,\n            "Feil"\n         ],\n         "Connecting": [\n            null,\n            "Kobler til"\n         ],\n         "Authenticating": [\n            null,\n            "Godkjenner"\n         ],\n         "Authentication Failed": [\n            null,\n            "Godkjenning mislyktes"\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            "Gjenopptar kryptert økt"\n         ],\n         "Generating private key.": [\n            null,\n            "Genererer privat nøkkel"\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            "Din nettleser kan bli uresponsiv"\n         ],\n         "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n            null,\n            "Godkjenningsforespørsel fra %1$s\\n\\nDin nettpratkontakt forsøker å bekrefte din identitet, ved å spørre deg spørsmålet under.\\n\\n%2$s"\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            "Kunne ikke bekrefte denne brukerens identitet"\n         ],\n         "Exchanging private key with contact.": [\n            null,\n            "Bytter private nøkler med kontakt"\n         ],\n         "Minimize this chat box": [\n            null,\n            ""\n         ],\n         "Personal message": [\n            null,\n            "Personlig melding"\n         ],\n         "Are you sure you want to clear the messages from this room?": [\n            null,\n            "Er du sikker på at du vil fjerne meldingene fra dette rommet?"\n         ],\n         "me": [\n            null,\n            "meg"\n         ],\n         "is typing": [\n            null,\n            "skriver"\n         ],\n         "has stopped typing": [\n            null,\n            "har stoppet å skrive"\n         ],\n         "Show this menu": [\n            null,\n            "Viser denne menyen"\n         ],\n         "Write in the third person": [\n            null,\n            "Skriv i tredjeperson"\n         ],\n         "Remove messages": [\n            null,\n            "Fjern meldinger"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            "Er du sikker på at du vil fjerne meldingene fra denne meldingsboksen?"\n         ],\n         "Your message could not be sent": [\n            null,\n            "Beskjeden din kunne ikke sendes"\n         ],\n         "We received an unencrypted message": [\n            null,\n            "Vi mottok en ukryptert beskjed"\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            "Vi mottok en uleselig melding"\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nOm du har bekreftet at avtrykkene matcher, klikk OK. I motsatt fall, trykk Avbryt."\n         ],\n         "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n            null,\n            "Du vil bli spurt etter å tilby et sikkerhetsspørsmål og siden svare på dette.\\n\\nDin kontakt vil så bli spurt om det samme spørsmålet, og om de svarer det nøyaktig samme svaret (det er forskjell på små og store bokstaver), vil identiteten verifiseres."\n         ],\n         "What is your security question?": [\n            null,\n            "Hva er ditt Sikkerhetsspørsmål?"\n         ],\n         "What is the answer to the security question?": [\n            null,\n            "Hva er svaret på ditt Sikkerhetsspørsmål?"\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            "Du har vedlagt en ugyldig godkjenningsplan."\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            "Dine meldinger er ikke kryptert lenger."\n         ],\n         "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n            null,\n            "Dine meldinger er nå krypterte, men identiteten til din kontakt har ikke blitt verifisert."\n         ],\n         "Your contact\'s identify has been verified.": [\n            null,\n            "Din kontakts identitet har blitt verifisert."\n         ],\n         "Your contact has ended encryption on their end, you should do the same.": [\n            null,\n            "Din kontakt har avsluttet kryptering i sin ende, dette burde du også gjøre."\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            "Dine meldinger er ikke krypterte. Klikk her for å aktivere OTR-kryptering."\n         ],\n         "Your messages are encrypted, but your contact has not been verified.": [\n            null,\n            "Dine meldinger er krypterte, men din kontakt har ikke blitt verifisert."\n         ],\n         "Your messages are encrypted and your contact verified.": [\n            null,\n            "Dine meldinger er krypterte og din kontakt er verifisert."\n         ],\n         "Your contact has closed their end of the private session, you should do the same": [\n            null,\n            "Din kontakt har avsluttet økten i sin ende, dette burde du også gjøre."\n         ],\n         "Clear all messages": [\n            null,\n            "Fjern alle meldinger"\n         ],\n         "End encrypted conversation": [\n            null,\n            "Avslutt kryptert økt"\n         ],\n         "Insert a smiley": [\n            null,\n            ""\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            "Last inn kryptert samtale på nytt"\n         ],\n         "Start a call": [\n            null,\n            "Start en samtale"\n         ],\n         "Start encrypted conversation": [\n            null,\n            "Start en kryptert samtale"\n         ],\n         "Verify with fingerprints": [\n            null,\n            "Verifiser med Avtrykk"\n         ],\n         "Verify with SMP": [\n            null,\n            "Verifiser med SMP"\n         ],\n         "What\'s this?": [\n            null,\n            "Hva er dette?"\n         ],\n         "Online": [\n            null,\n            "Pålogget"\n         ],\n         "Busy": [\n            null,\n            "Opptatt"\n         ],\n         "Away": [\n            null,\n            "Borte"\n         ],\n         "Offline": [\n            null,\n            "Avlogget"\n         ],\n         "Log out": [\n            null,\n            "Logg Av"\n         ],\n         "Contact name": [\n            null,\n            "Kontaktnavn"\n         ],\n         "Search": [\n            null,\n            "Søk"\n         ],\n         "e.g. user@example.com": [\n            null,\n            ""\n         ],\n         "Add": [\n            null,\n            "Legg Til"\n         ],\n         "Click to add new chat contacts": [\n            null,\n            "Klikk for å legge til nye meldingskontakter"\n         ],\n         "Add a contact": [\n            null,\n            "Legg til en Kontakt"\n         ],\n         "No users found": [\n            null,\n            "Ingen brukere funnet"\n         ],\n         "Click to add as a chat contact": [\n            null,\n            "Klikk for å legge til som meldingskontakt"\n         ],\n         "Room name": [\n            null,\n            "Romnavn"\n         ],\n         "Nickname": [\n            null,\n            "Kallenavn"\n         ],\n         "Server": [\n            null,\n            "Server"\n         ],\n         "Show rooms": [\n            null,\n            "Vis Rom"\n         ],\n         "Rooms": [\n            null,\n            "Rom"\n         ],\n         "No rooms on %1$s": [\n            null,\n            "Ingen rom på %1$s"\n         ],\n         "Rooms on %1$s": [\n            null,\n            "Rom på %1$s"\n         ],\n         "Click to open this room": [\n            null,\n            "Klikk for å åpne dette rommet"\n         ],\n         "Show more information on this room": [\n            null,\n            "Vis mer informasjon om dette rommet"\n         ],\n         "Description:": [\n            null,\n            "Beskrivelse:"\n         ],\n         "Occupants:": [\n            null,\n            "Brukere her:"\n         ],\n         "Features:": [\n            null,\n            "Egenskaper:"\n         ],\n         "Requires authentication": [\n            null,\n            "Krever Godkjenning"\n         ],\n         "Hidden": [\n            null,\n            "Skjult"\n         ],\n         "Requires an invitation": [\n            null,\n            "Krever en invitasjon"\n         ],\n         "Moderated": [\n            null,\n            "Moderert"\n         ],\n         "Non-anonymous": [\n            null,\n            "Ikke-Anonym"\n         ],\n         "Open room": [\n            null,\n            "Åpent Rom"\n         ],\n         "Permanent room": [\n            null,\n            "Permanent Rom"\n         ],\n         "Public": [\n            null,\n            "Alle"\n         ],\n         "Semi-anonymous": [\n            null,\n            "Semi-anonymt"\n         ],\n         "Temporary room": [\n            null,\n            "Midlertidig Rom"\n         ],\n         "Unmoderated": [\n            null,\n            "Umoderert"\n         ],\n         "This user is a moderator": [\n            null,\n            "Denne brukeren er moderator"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "Denne brukeren kan skrive meldinger i dette rommet"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "Denne brukeren kan IKKE sende meldinger i dette rommet"\n         ],\n         "Invite...": [\n            null,\n            "Invitér..."\n         ],\n         "Occupants": [\n            null,\n            "Brukere her:"\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            "Du er i ferd med å invitere %1$s til samtalerommet \\"%2$s\\". "\n         ],\n         "You may optionally include a message, explaining the reason for the invitation.": [\n            null,\n            "Du kan eventuelt inkludere en melding og forklare årsaken til invitasjonen."\n         ],\n         "Message": [\n            null,\n            "Melding"\n         ],\n         "Error: could not execute the command": [\n            null,\n            "Feil: kunne ikke utføre kommandoen"\n         ],\n         "Error: the \\"": [\n            null,\n            ""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            ""\n         ],\n         "Ban user from room": [\n            null,\n            "Utesteng bruker fra rommet"\n         ],\n         "Kick user from room": [\n            null,\n            "Kast ut bruker fra rommet"\n         ],\n         "Write in 3rd person": [\n            null,\n            "Skriv i tredjeperson"\n         ],\n         "Grant membership to a user": [\n            null,\n            ""\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            "Fjern brukerens muligheter til å skrive meldinger"\n         ],\n         "Change your nickname": [\n            null,\n            "Endre ditt kallenavn"\n         ],\n         "Grant moderator role to user": [\n            null,\n            ""\n         ],\n         "Revoke user\'s membership": [\n            null,\n            ""\n         ],\n         "Set room topic": [\n            null,\n            "Endre rommets emne"\n         ],\n         "Allow muted user to post messages": [\n            null,\n            "Tillat stumme brukere å skrive meldinger"\n         ],\n         "Save": [\n            null,\n            "Lagre"\n         ],\n         "Cancel": [\n            null,\n            "Avbryt"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "En feil skjedde under lagring av skjemaet."\n         ],\n         "This chatroom requires a password": [\n            null,\n            "Dette rommet krever et passord"\n         ],\n         "Password: ": [\n            null,\n            "Passord:"\n         ],\n         "Submit": [\n            null,\n            "Send"\n         ],\n         "This room is not anonymous": [\n            null,\n            "Dette rommet er ikke anonymt"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            "Dette rommet viser nå utilgjengelige medlemmer"\n         ],\n         "This room does not show unavailable members": [\n            null,\n            "Dette rommet viser ikke utilgjengelige medlemmer"\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            "Ikke-personvernsrelatert romkonfigurasjon har blitt endret"\n         ],\n         "Room logging is now enabled": [\n            null,\n            "Romlogging er nå aktivert"\n         ],\n         "Room logging is now disabled": [\n            null,\n            "Romlogging er nå deaktivert"\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "Dette rommet er nå ikke-anonymt"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "Dette rommet er nå semi-anonymt"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "Dette rommet er nå totalt anonymt"\n         ],\n         "A new room has been created": [\n            null,\n            "Et nytt rom har blitt opprettet"\n         ],\n         "You have been banned from this room": [\n            null,\n            "Du har blitt utestengt fra dette rommet"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "Du ble kastet ut av dette rommet"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            "Du har blitt fjernet fra dette rommet på grunn av en holdningsendring"\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            "Du har blitt fjernet fra dette rommet fordi rommet nå kun tillater medlemmer, noe du ikke er."\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            "Du har blitt fjernet fra dette rommet fordi MBC (Multi-Bruker-Chat)-tjenesten er stengt ned."\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "<strong>%1$s</strong>  har blitt utestengt"\n         ],\n         "<strong>%1$s</strong>\'s nickname has changed": [\n            null,\n            "<strong>%1$s</strong> sitt kallenavn er endret"\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "<strong>%1$s</strong>  ble kastet ut"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            "<strong>%1$s</strong> har blitt fjernet på grunn av en holdningsendring"\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            "<strong>%1$s</strong> har blitt fjernet på grunn av at han/hun ikke er medlem"\n         ],\n         "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n            null,\n            "Ditt kallenavn har blitt automatisk endret til <strong>%1$s</strong> "\n         ],\n         "Your nickname has been changed to: <strong>%1$s</strong>": [\n            null,\n            "Ditt kallenavn har blitt endret til <strong>%1$s</strong> "\n         ],\n         "The reason given is: \\"": [\n            null,\n            "Årsaken som er oppgitt er: \\""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "Du er ikke på medlemslisten til dette rommet"\n         ],\n         "No nickname was specified": [\n            null,\n            "Ingen kallenavn var spesifisert"\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "Du har ikke tillatelse til å opprette nye rom"\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "Ditt kallenavn er ikke i samsvar med rommets regler"\n         ],\n         "Your nickname is already taken": [\n            null,\n            "Kallenavnet er allerede tatt"\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "Dette rommet eksisterer ikke (enda)"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "Dette rommet har nådd maksimalt antall brukere"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            "Emnet ble endret den %1$s til: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            "%1$s har invitert deg til å bli med i chatterommet: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            "%1$s har invitert deg til å bli med i chatterommet: %2$s, og forlot selv av følgende grunn:  \\"%3$s\\""\n         ],\n         "Click to restore this chat": [\n            null,\n            "Klikk for å gjenopprette denne samtalen"\n         ],\n         "Minimized": [\n            null,\n            "Minimert"\n         ],\n         "Click to remove this contact": [\n            null,\n            "Klikk for å fjerne denne kontakten"\n         ],\n         "Click to accept this contact request": [\n            null,\n            "Klikk for å Godta denne kontaktforespørselen"\n         ],\n         "Click to decline this contact request": [\n            null,\n            "Klikk for å avslå denne kontaktforespørselen"\n         ],\n         "Click to chat with this contact": [\n            null,\n            "Klikk for å chatte med denne kontakten"\n         ],\n         "Name": [\n            null,\n            ""\n         ],\n         "Are you sure you want to remove this contact?": [\n            null,\n            "Er du sikker på at du vil fjerne denne kontakten?"\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            ""\n         ],\n         "Are you sure you want to decline this contact request?": [\n            null,\n            "Er du sikker på at du vil avslå denne kontaktforespørselen?"\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            ""\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            ""\n         ],\n         "Type to filter": [\n            null,\n            "Skriv til filter"\n         ],\n         "I am %1$s": [\n            null,\n            "Jeg er %1$s"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "Klikk her for å skrive en personlig statusmelding"\n         ],\n         "Click to change your chat status": [\n            null,\n            "Klikk for å endre din meldingsstatus"\n         ],\n         "Custom status": [\n            null,\n            "Personlig status"\n         ],\n         "online": [\n            null,\n            "pålogget"\n         ],\n         "busy": [\n            null,\n            "opptatt"\n         ],\n         "away for long": [\n            null,\n            "borte lenge"\n         ],\n         "away": [\n            null,\n            "borte"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            "Din XMPP-tilbyders domenenavn:"\n         ],\n         "Fetch registration form": [\n            null,\n            "Hent registreringsskjema"\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            "Tips: En liste med offentlige XMPP-tilbydere er tilgjengelig"\n         ],\n         "here": [\n            null,\n            "her"\n         ],\n         "Register": [\n            null,\n            "Registrér deg"\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            "Beklager, den valgte tilbyderen støtter ikke in band kontoregistrering. Vennligst prøv igjen med en annen tilbyder. "\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            "Spør etter registreringsskjema fra XMPP-tjeneren"\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            "Noe gikk galt under etablering av forbindelse med \\"%1$s\\". Er du sikker på at denne eksisterer?"\n         ],\n         "Now logging you in": [\n            null,\n            "Logger deg inn"\n         ],\n         "Registered successfully": [\n            null,\n            "Registrering var vellykket"\n         ],\n         "Return": [\n            null,\n            "Tilbake"\n         ],\n         "XMPP Username:": [\n            null,\n            "XMPP Brukernavn:"\n         ],\n         "Password:": [\n            null,\n            "Passord:"\n         ],\n         "Log In": [\n            null,\n            "Logg inn"\n         ],\n         "user@server": [\n            null,\n            ""\n         ],\n         "Sign in": [\n            null,\n            "Innlogging"\n         ],\n         "Toggle chat": [\n            null,\n            "Endre chatten"\n         ]\n      }\n   }\n}'}),define("text!nl",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "plural_forms": "nplurals=2; plural=(n != 1);",\n            "lang": "nl"\n         },\n         " e.g. conversejs.org": [\n            null,\n            ""\n         ],\n         "unencrypted": [\n            null,\n            "ongecodeerde"\n         ],\n         "unverified": [\n            null,\n            "niet geverifieerd"\n         ],\n         "verified": [\n            null,\n            "geverifieerd"\n         ],\n         "finished": [\n            null,\n            "klaar"\n         ],\n         "This contact is busy": [\n            null,\n            "Contact is bezet"\n         ],\n         "This contact is online": [\n            null,\n            "Contact is online"\n         ],\n         "This contact is offline": [\n            null,\n            "Contact is offline"\n         ],\n         "This contact is unavailable": [\n            null,\n            "Contact is niet beschikbaar"\n         ],\n         "This contact is away for an extended period": [\n            null,\n            "Contact is afwezig voor lange periode"\n         ],\n         "This contact is away": [\n            null,\n            "Conact is afwezig"\n         ],\n         "My contacts": [\n            null,\n            "Mijn contacts"\n         ],\n         "Pending contacts": [\n            null,\n            "Conacten in afwachting van"\n         ],\n         "Contact requests": [\n            null,\n            "Contact uitnodiging"\n         ],\n         "Ungrouped": [\n            null,\n            ""\n         ],\n         "Contacts": [\n            null,\n            "Contacten"\n         ],\n         "Groups": [\n            null,\n            ""\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            ""\n         ],\n         "Error": [\n            null,\n            "Error"\n         ],\n         "Connecting": [\n            null,\n            "Verbinden"\n         ],\n         "Authenticating": [\n            null,\n            "Authenticeren"\n         ],\n         "Authentication Failed": [\n            null,\n            "Authenticeren mislukt"\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            "Bezig versleutelde sessie te herstellen"\n         ],\n         "Generating private key.": [\n            null,\n            ""\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            ""\n         ],\n         "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n            null,\n            ""\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            "Niet kon de identiteit van deze gebruiker niet identificeren."\n         ],\n         "Exchanging private key with contact.": [\n            null,\n            ""\n         ],\n         "Minimize this chat box": [\n            null,\n            ""\n         ],\n         "Personal message": [\n            null,\n            "Persoonlijk bericht"\n         ],\n         "me": [\n            null,\n            "ikzelf"\n         ],\n         "Show this menu": [\n            null,\n            "Toon dit menu"\n         ],\n         "Write in the third person": [\n            null,\n            "Schrijf in de 3de persoon"\n         ],\n         "Remove messages": [\n            null,\n            "Verwijder bericht"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            ""\n         ],\n         "Your message could not be sent": [\n            null,\n            "Je bericht kon niet worden verzonden"\n         ],\n         "We received an unencrypted message": [\n            null,\n            "We ontvingen een unencrypted bericht "\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            "We ontvangen een onleesbaar unencrypted bericht"\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            ""\n         ],\n         "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n            null,\n            ""\n         ],\n         "What is your security question?": [\n            null,\n            "Wat is jou sericury vraag?"\n         ],\n         "What is the answer to the security question?": [\n            null,\n            "Wat is het antwoord op de security vraag?"\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            ""\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            "Je berichten zijn niet meer encrypted"\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            "Jou bericht is niet encrypted. KLik hier om ORC encrytion aan te zetten."\n         ],\n         "End encrypted conversation": [\n            null,\n            "Beeindig encrypted gesprek"\n         ],\n         "Insert a smiley": [\n            null,\n            ""\n         ],\n         "Hide the list of occupants": [\n            null,\n            ""\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            "Ververs encrypted gesprek"\n         ],\n         "Start a call": [\n            null,\n            ""\n         ],\n         "Start encrypted conversation": [\n            null,\n            "Start encrypted gesprek"\n         ],\n         "Verify with fingerprints": [\n            null,\n            ""\n         ],\n         "Verify with SMP": [\n            null,\n            ""\n         ],\n         "What\'s this?": [\n            null,\n            "Wat is dit?"\n         ],\n         "Online": [\n            null,\n            "Online"\n         ],\n         "Busy": [\n            null,\n            "Bezet"\n         ],\n         "Away": [\n            null,\n            "Afwezig"\n         ],\n         "Offline": [\n            null,\n            ""\n         ],\n         "Contact name": [\n            null,\n            "Contact naam"\n         ],\n         "Search": [\n            null,\n            "Zoeken"\n         ],\n         "e.g. user@example.com": [\n            null,\n            ""\n         ],\n         "Add": [\n            null,\n            "Toevoegen"\n         ],\n         "Click to add new chat contacts": [\n            null,\n            "Klik om nieuwe contacten toe te voegen"\n         ],\n         "Add a contact": [\n            null,\n            "Voeg contact toe"\n         ],\n         "No users found": [\n            null,\n            "Geen gebruikers gevonden"\n         ],\n         "Click to add as a chat contact": [\n            null,\n            "Klik om contact toe te voegen"\n         ],\n         "Room name": [\n            null,\n            "Room naam"\n         ],\n         "Nickname": [\n            null,\n            "Nickname"\n         ],\n         "Server": [\n            null,\n            "Server"\n         ],\n         "Show rooms": [\n            null,\n            "Toon rooms"\n         ],\n         "Rooms": [\n            null,\n            "Rooms"\n         ],\n         "No rooms on %1$s": [\n            null,\n            "Geen room op %1$s"\n         ],\n         "Rooms on %1$s": [\n            null,\n            "Room op %1$s"\n         ],\n         "Click to open this room": [\n            null,\n            "Klik om room te openen"\n         ],\n         "Show more information on this room": [\n            null,\n            "Toon meer informatie over deze room"\n         ],\n         "Description:": [\n            null,\n            "Beschrijving"\n         ],\n         "Occupants:": [\n            null,\n            "Deelnemers:"\n         ],\n         "Features:": [\n            null,\n            "Functies:"\n         ],\n         "Requires authentication": [\n            null,\n            "Verificatie vereist"\n         ],\n         "Hidden": [\n            null,\n            "Verborgen"\n         ],\n         "Requires an invitation": [\n            null,\n            "Veriest een uitnodiging"\n         ],\n         "Moderated": [\n            null,\n            "Gemodereerd"\n         ],\n         "Non-anonymous": [\n            null,\n            "Niet annoniem"\n         ],\n         "Open room": [\n            null,\n            "Open room"\n         ],\n         "Permanent room": [\n            null,\n            "Blijvend room"\n         ],\n         "Public": [\n            null,\n            "Publiek"\n         ],\n         "Semi-anonymous": [\n            null,\n            "Semi annoniem"\n         ],\n         "Temporary room": [\n            null,\n            "Tijdelijke room"\n         ],\n         "Unmoderated": [\n            null,\n            "Niet gemodereerd"\n         ],\n         "This user is a moderator": [\n            null,\n            "Dit is een moderator"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "Deze gebruiker kan berichten sturen in deze room"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "Deze gebruiker kan NIET een bericht sturen in deze room"\n         ],\n         "Invite...": [\n            null,\n            ""\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            ""\n         ],\n         "You may optionally include a message, explaining the reason for the invitation.": [\n            null,\n            ""\n         ],\n         "Message": [\n            null,\n            "Bericht"\n         ],\n         "Error: could not execute the command": [\n            null,\n            ""\n         ],\n         "Error: the \\"": [\n            null,\n            ""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            ""\n         ],\n         "Change user role to occupant": [\n            null,\n            ""\n         ],\n         "Grant membership to a user": [\n            null,\n            ""\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            ""\n         ],\n         "Change your nickname": [\n            null,\n            ""\n         ],\n         "Grant moderator role to user": [\n            null,\n            ""\n         ],\n         "Revoke user\'s membership": [\n            null,\n            ""\n         ],\n         "Allow muted user to post messages": [\n            null,\n            ""\n         ],\n         "Save": [\n            null,\n            "Opslaan"\n         ],\n         "Cancel": [\n            null,\n            "Annuleren"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "Een error tijdens het opslaan van het formulier."\n         ],\n         "This chatroom requires a password": [\n            null,\n            "Chatroom heeft een wachtwoord"\n         ],\n         "Password: ": [\n            null,\n            "Wachtwoord: "\n         ],\n         "Submit": [\n            null,\n            "Indienen"\n         ],\n         "This room is not anonymous": [\n            null,\n            "Deze room is niet annoniem"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            ""\n         ],\n         "This room does not show unavailable members": [\n            null,\n            ""\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            ""\n         ],\n         "Room logging is now enabled": [\n            null,\n            ""\n         ],\n         "Room logging is now disabled": [\n            null,\n            ""\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "Deze room is nu niet annoniem"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "Deze room is nu semie annoniem"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "Deze room is nu volledig annoniem"\n         ],\n         "A new room has been created": [\n            null,\n            "Een nieuwe room is gemaakt"\n         ],\n         "You have been banned from this room": [\n            null,\n            "Je bent verbannen uit deze room"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "Je bent uit de room gegooid"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            ""\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            ""\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            ""\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "<strong>%1$s</strong> is verbannen"\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "<strong>%1$s</strong> has been kicked out"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            ""\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            ""\n         ],\n         "The reason given is: \\"": [\n            null,\n            ""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "Je bent niet een gebruiker van deze room"\n         ],\n         "No nickname was specified": [\n            null,\n            "Geen nickname ingegeven"\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "Je bent niet toegestaan nieuwe rooms te maken"\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "Je nickname is niet conform policy"\n         ],\n         "Your nickname is already taken": [\n            null,\n            "Je nickname bestaat al"\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "Deze room bestaat niet"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "Deze room heeft het maximale aantal gebruikers"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            ""\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            ""\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            ""\n         ],\n         "Minimized": [\n            null,\n            ""\n         ],\n         "Click to remove this contact": [\n            null,\n            "Klik om contact te verwijderen"\n         ],\n         "Click to chat with this contact": [\n            null,\n            "Klik om te chatten met contact"\n         ],\n         "Name": [\n            null,\n            ""\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            ""\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            ""\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            ""\n         ],\n         "Type to filter": [\n            null,\n            ""\n         ],\n         "I am %1$s": [\n            null,\n            "Ik ben %1$s"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "Klik hier om custom status bericht te maken"\n         ],\n         "Click to change your chat status": [\n            null,\n            "Klik hier om status te wijzigen"\n         ],\n         "Custom status": [\n            null,\n            ""\n         ],\n         "online": [\n            null,\n            "online"\n         ],\n         "busy": [\n            null,\n            "bezet"\n         ],\n         "away for long": [\n            null,\n            "afwezig lange tijd"\n         ],\n         "away": [\n            null,\n            "afwezig"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            ""\n         ],\n         "Fetch registration form": [\n            null,\n            ""\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            ""\n         ],\n         "here": [\n            null,\n            ""\n         ],\n         "Register": [\n            null,\n            ""\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            ""\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            ""\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            ""\n         ],\n         "Now logging you in": [\n            null,\n            ""\n         ],\n         "Registered successfully": [\n            null,\n            ""\n         ],\n         "Return": [\n            null,\n            ""\n         ],\n         "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n            null,\n            ""\n         ],\n         "Password:": [\n            null,\n            "Wachtwoord:"\n         ],\n         "Log In": [\n            null,\n            "Aanmelden"\n         ],\n         "user@server": [\n            null,\n            ""\n         ],\n         "Sign in": [\n            null,\n            "Aanmelden"\n         ],\n         "Toggle chat": [\n            null,\n            ""\n         ]\n      }\n   }\n}'}),define("text!pl",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "plural_forms": "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);",\n            "lang": "pl"\n         },\n         " e.g. conversejs.org": [\n            null,\n            "np. conversejs.org"\n         ],\n         "unencrypted": [\n            null,\n            "nieszyfrowane"\n         ],\n         "unverified": [\n            null,\n            "niezweryfikowane"\n         ],\n         "verified": [\n            null,\n            "zweryfikowane"\n         ],\n         "finished": [\n            null,\n            "zakończone"\n         ],\n         "This contact is busy": [\n            null,\n            "Kontakt jest zajęty"\n         ],\n         "This contact is online": [\n            null,\n            "Kontakt jest połączony"\n         ],\n         "This contact is offline": [\n            null,\n            "Kontakt jest niepołączony"\n         ],\n         "This contact is unavailable": [\n            null,\n            "Kontakt jest niedostępny"\n         ],\n         "This contact is away for an extended period": [\n            null,\n            "Kontakt jest nieobecny przez dłuższą chwilę"\n         ],\n         "This contact is away": [\n            null,\n            "Kontakt jest nieobecny"\n         ],\n         "Click to hide these contacts": [\n            null,\n            "Kliknij aby schować te kontakty"\n         ],\n         "My contacts": [\n            null,\n            "Moje kontakty"\n         ],\n         "Pending contacts": [\n            null,\n            "Kontakty oczekujące"\n         ],\n         "Contact requests": [\n            null,\n            "Zaproszenia do kontaktu"\n         ],\n         "Ungrouped": [\n            null,\n            "Niezgrupowane"\n         ],\n         "Contacts": [\n            null,\n            "Kontakty"\n         ],\n         "Groups": [\n            null,\n            "Grupy"\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            ""\n         ],\n         "Error": [\n            null,\n            "Błąd"\n         ],\n         "Connecting": [\n            null,\n            "Łączę się"\n         ],\n         "Authenticating": [\n            null,\n            "Autoryzacja"\n         ],\n         "Authentication Failed": [\n            null,\n            "Autoryzacja nie powiodła się"\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            "Przywrócenie sesji szyfrowanej"\n         ],\n         "Generating private key.": [\n            null,\n            "Generuję klucz prywatny."\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            "Twoja przeglądarka może nieco zwolnić."\n         ],\n         "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n            null,\n            "Prośba o autoryzację od %1$s\\n\\nKontakt próbuje zweryfikować twoją tożsamość, zadając ci pytanie poniżej.\\n\\n%2$s"\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            "Nie jestem w stanie zweryfikować tożsamości kontaktu."\n         ],\n         "Exchanging private key with contact.": [\n            null,\n            "Wymieniam klucze szyfrujące z kontaktem."\n         ],\n         "Minimize this chat box": [\n            null,\n            ""\n         ],\n         "Personal message": [\n            null,\n            "Wiadomość osobista"\n         ],\n         "Are you sure you want to clear the messages from this room?": [\n            null,\n            "Potwierdź czy rzeczywiście chcesz wyczyścić wiadomości z tego pokoju?"\n         ],\n         "me": [\n            null,\n            "ja"\n         ],\n         "is typing": [\n            null,\n            "pisze"\n         ],\n         "has stopped typing": [\n            null,\n            "przestał pisać"\n         ],\n         "has gone away": [\n            null,\n            "uciekł"\n         ],\n         "Show this menu": [\n            null,\n            "Pokaż menu"\n         ],\n         "Write in the third person": [\n            null,\n            "Pisz w trzeciej osobie"\n         ],\n         "Remove messages": [\n            null,\n            "Usuń wiadomość"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            "Potwierdź czy rzeczywiście chcesz wyczyścić wiadomości z okienka rozmowy?"\n         ],\n         "Your message could not be sent": [\n            null,\n            "Twoja wiadomość nie została wysłana"\n         ],\n         "We received an unencrypted message": [\n            null,\n            "Otrzymaliśmy niezaszyfrowaną wiadomość"\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            "Otrzymaliśmy nieczytelną zaszyfrowaną wiadomość"\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            "Oto odciski palców, potwiedź je proszę z %1$s używając innego sposobuwymiany informacji niż ta rozmowa.\\n\\nOdcisk palca dla ciebie, %2$s: %3$s\\n\\nOdcisk palca dla %1$s: %4$s\\n\\nJeśli odciski palców zostały potwierdzone, kliknij OK, w inny wypadku kliknij Anuluj."\n         ],\n         "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n            null,\n            "Poprosimy cię o podanie pytania sprawdzającego i odpowiedzi na nie.\\n\\nTwój kontakt zostanie poproszony później o odpowiedź na to samo pytanie i jeśli udzieli tej samej odpowiedzi (ważna jest wielkość liter), tożsamość zostanie zwerfikowana."\n         ],\n         "What is your security question?": [\n            null,\n            "Jakie jest pytanie bezpieczeństwa?"\n         ],\n         "What is the answer to the security question?": [\n            null,\n            "Jaka jest odpowiedź na pytanie bezpieczeństwa?"\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            "Niewłaściwy schemat autoryzacji"\n         ],\n         "has gone offline": [\n            null,\n            "wyłączył się"\n         ],\n         "is busy": [\n            null,\n            "zajęty"\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            "Twoje wiadomości nie są już szyfrowane"\n         ],\n         "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n            null,\n            "Wiadomości są teraz szyfrowane, ale tożsamość kontaktu nie została zweryfikowana."\n         ],\n         "Your contact\'s identify has been verified.": [\n            null,\n            "Tożsamość kontaktu została zweryfikowana"\n         ],\n         "Your contact has ended encryption on their end, you should do the same.": [\n            null,\n            "Kontakt zakończył sesję szyfrowaną, powinieneś zrobić to samo."\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            "Twoje wiadomości nie są szyfrowane. Kliknij, aby uruchomić szyfrowanie OTR"\n         ],\n         "Your messages are encrypted, but your contact has not been verified.": [\n            null,\n            "Wiadomości są szyfrowane, ale tożsamość kontaktu nie została zweryfikowana."\n         ],\n         "Your messages are encrypted and your contact verified.": [\n            null,\n            "Wiadomości są szyfrowane i tożsamość kontaktu została zweryfikowana."\n         ],\n         "Your contact has closed their end of the private session, you should do the same": [\n            null,\n            "Kontakt zakończył prywatną rozmowę i ty zrób to samo"\n         ],\n         "Clear all messages": [\n            null,\n            "Wyczyść wszystkie wiadomości"\n         ],\n         "End encrypted conversation": [\n            null,\n            "Zakończ szyfrowaną rozmowę"\n         ],\n         "Insert a smiley": [\n            null,\n            "Wstaw uśmieszek"\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            "Odśwież szyfrowaną rozmowę"\n         ],\n         "Start a call": [\n            null,\n            "Zadzwoń"\n         ],\n         "Start encrypted conversation": [\n            null,\n            "Rozpocznij szyfrowaną rozmowę"\n         ],\n         "Verify with fingerprints": [\n            null,\n            "Zweryfikuj za pomocą odcisków palców"\n         ],\n         "Verify with SMP": [\n            null,\n            "Zweryfikuj za pomocą SMP"\n         ],\n         "What\'s this?": [\n            null,\n            "Co to jest?"\n         ],\n         "Online": [\n            null,\n            "Dostępny"\n         ],\n         "Busy": [\n            null,\n            "Zajęty"\n         ],\n         "Away": [\n            null,\n            "Nieobecny"\n         ],\n         "Offline": [\n            null,\n            "Rozłączony"\n         ],\n         "Log out": [\n            null,\n            "Wyloguj"\n         ],\n         "Contact name": [\n            null,\n            "Nazwa kontaktu"\n         ],\n         "Search": [\n            null,\n            "Szukaj"\n         ],\n         "e.g. user@example.com": [\n            null,\n            "np. user@example.com"\n         ],\n         "Add": [\n            null,\n            "Dodaj"\n         ],\n         "Click to add new chat contacts": [\n            null,\n            "Kliknij aby dodać nowe kontakty"\n         ],\n         "Add a contact": [\n            null,\n            "Dodaj kontakt"\n         ],\n         "No users found": [\n            null,\n            "Nie znaleziono użytkowników"\n         ],\n         "Click to add as a chat contact": [\n            null,\n            "Kliknij aby dodać jako kontakt"\n         ],\n         "Room name": [\n            null,\n            "Nazwa pokoju"\n         ],\n         "Nickname": [\n            null,\n            "Ksywka"\n         ],\n         "Server": [\n            null,\n            "Serwer"\n         ],\n         "Join Room": [\n            null,\n            "Wejdź do pokoju"\n         ],\n         "Show rooms": [\n            null,\n            "Pokaż pokoje"\n         ],\n         "Rooms": [\n            null,\n            "Pokoje"\n         ],\n         "No rooms on %1$s": [\n            null,\n            "Brak jest pokojów na %1$s"\n         ],\n         "Rooms on %1$s": [\n            null,\n            "Pokoje na %1$s"\n         ],\n         "Click to open this room": [\n            null,\n            "Kliknij aby wejść do pokoju"\n         ],\n         "Show more information on this room": [\n            null,\n            "Pokaż więcej informacji o pokoju"\n         ],\n         "Description:": [\n            null,\n            "Opis:"\n         ],\n         "Occupants:": [\n            null,\n            "Uczestnicy:"\n         ],\n         "Features:": [\n            null,\n            "Możliwości:"\n         ],\n         "Requires authentication": [\n            null,\n            "Wymaga autoryzacji"\n         ],\n         "Hidden": [\n            null,\n            "Ukryty"\n         ],\n         "Requires an invitation": [\n            null,\n            "Wymaga zaproszenia"\n         ],\n         "Moderated": [\n            null,\n            "Moderowany"\n         ],\n         "Non-anonymous": [\n            null,\n            "Nieanonimowy"\n         ],\n         "Open room": [\n            null,\n            "Otwarty pokój"\n         ],\n         "Permanent room": [\n            null,\n            "Stały pokój"\n         ],\n         "Public": [\n            null,\n            "Publiczny"\n         ],\n         "Semi-anonymous": [\n            null,\n            "Półanonimowy"\n         ],\n         "Temporary room": [\n            null,\n            "Pokój tymczasowy"\n         ],\n         "Unmoderated": [\n            null,\n            "Niemoderowany"\n         ],\n         "This user is a moderator": [\n            null,\n            "Ten człowiek jest moderatorem"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "Ten człowiek może rozmawiać w niejszym pokoju"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "Ten człowiek nie może rozmawiać w niniejszym pokoju"\n         ],\n         "Invite...": [\n            null,\n            "Zaproś..."\n         ],\n         "Occupants": [\n            null,\n            "Uczestników"\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            "Zamierzasz zaprosić %1$s do pokoju rozmów \\"%2$s\\". "\n         ],\n         "You may optionally include a message, explaining the reason for the invitation.": [\n            null,\n            "Masz opcjonalną możliwość dołączenia wiadomości, która wyjaśni przyczynę zaproszenia."\n         ],\n         "Message": [\n            null,\n            "Wiadomość:"\n         ],\n         "Error: could not execute the command": [\n            null,\n            "Błąd: nie potrafię uruchomić polecenia"\n         ],\n         "Error: the \\"": [\n            null,\n            "Błąd: \\""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            "Przyznaj prawa administratora"\n         ],\n         "Ban user from room": [\n            null,\n            "Zablokuj dostępu do pokoju"\n         ],\n         "Kick user from room": [\n            null,\n            "Wykop z pokoju"\n         ],\n         "Write in 3rd person": [\n            null,\n            "Pisz w trzeciej osobie"\n         ],\n         "Grant membership to a user": [\n            null,\n            "Przyznaj członkowstwo "\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            "Zablokuj człowiekowi możliwość rozmowy"\n         ],\n         "Change your nickname": [\n            null,\n            "Zmień ksywkę"\n         ],\n         "Grant moderator role to user": [\n            null,\n            "Przyznaj prawa moderatora"\n         ],\n         "Grant ownership of this room": [\n            null,\n            "Uczyń właścicielem pokoju"\n         ],\n         "Revoke user\'s membership": [\n            null,\n            "Usuń z listy członków"\n         ],\n         "Set room topic": [\n            null,\n            "Ustaw temat pokoju"\n         ],\n         "Allow muted user to post messages": [\n            null,\n            "Pozwól uciszonemu człowiekowi na rozmowę"\n         ],\n         "Save": [\n            null,\n            "Zachowaj"\n         ],\n         "Cancel": [\n            null,\n            "Anuluj"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "Wystąpił błąd w czasie próby zachowania formularza."\n         ],\n         "This chatroom requires a password": [\n            null,\n            "Pokój rozmów wymaga podania hasła"\n         ],\n         "Password: ": [\n            null,\n            "Hasło:"\n         ],\n         "Submit": [\n            null,\n            "Wyślij"\n         ],\n         "This room is not anonymous": [\n            null,\n            "Pokój nie jest anonimowy"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            "Pokój pokazuje niedostępnych rozmówców"\n         ],\n         "This room does not show unavailable members": [\n            null,\n            "Ten pokój nie wyświetla niedostępnych członków"\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            "Ustawienia pokoju nie związane z prywatnością zostały zmienione"\n         ],\n         "Room logging is now enabled": [\n            null,\n            "Zostało włączone zapisywanie rozmów w pokoju"\n         ],\n         "Room logging is now disabled": [\n            null,\n            "Zostało wyłączone zapisywanie rozmów w pokoju"\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "Pokój stał się nieanonimowy"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "Pokój stał się półanonimowy"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "Pokój jest teraz w pełni anonimowy"\n         ],\n         "A new room has been created": [\n            null,\n            "Został utworzony nowy pokój"\n         ],\n         "You have been banned from this room": [\n            null,\n            "Jesteś niemile widziany w tym pokoju"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "Zostałeś wykopany z pokoju"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            "Zostałeś usunięty z pokoju ze względu na zmianę przynależności"\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            "Zostałeś usunięty z pokoju ze względu na to, że pokój zmienił się na wymagający członkowstwa, a ty nie jesteś członkiem"\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            "Zostałeś usunięty z pokoju ze względu na to, że serwis MUC(Multi-user chat) został wyłączony."\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "<strong>%1$s</strong> został zbanowany"\n         ],\n         "<strong>%1$s</strong>\'s nickname has changed": [\n            null,\n            "<strong>%1$s</strong> zmienił ksywkę"\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "<strong>%1$s</strong> został wykopany"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            "<strong>%1$s</strong> został usunięty z powodu zmiany przynależności"\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            "<strong>%1$s</strong> został usunięty ze względu na to, że nie jest członkiem"\n         ],\n         "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n            null,\n            "Twoja ksywka została automatycznie zmieniona na: <strong>%1$s</strong>"\n         ],\n         "Your nickname has been changed to: <strong>%1$s</strong>": [\n            null,\n            "Twoja ksywka została zmieniona na: <strong>%1$s</strong>"\n         ],\n         "The reason given is: \\"": [\n            null,\n            "Podana przyczyna to: \\""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "Nie jesteś członkiem tego pokoju rozmów"\n         ],\n         "No nickname was specified": [\n            null,\n            "Nie podałeś ksywki"\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "Nie masz uprawnień do tworzenia nowych pokojów rozmów"\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "Twoja ksywka nie jest zgodna z regulaminem pokoju"\n         ],\n         "Your nickname is already taken": [\n            null,\n            "Twoja ksywka jest już w użyciu"\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "Ten pokój (jeszcze) nie istnieje"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "Pokój przekroczył dozwoloną ilość rozmówców"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            "Temat ustawiony przez %1$s na: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            "%1$s zaprosił(a) cię do wejścia do pokoju rozmów %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            "%1$s zaprosił cię do pokoju: %2$s, podając następujący powód: \\"%3$s\\""\n         ],\n         "Click to restore this chat": [\n            null,\n            "Kliknij aby powrócić do rozmowy"\n         ],\n         "Minimized": [\n            null,\n            "Zminimalizowany"\n         ],\n         "Click to remove this contact": [\n            null,\n            "Kliknij aby usunąć kontakt"\n         ],\n         "Click to accept this contact request": [\n            null,\n            "Klknij aby zaakceptować życzenie nawiązania kontaktu"\n         ],\n         "Click to decline this contact request": [\n            null,\n            "Kliknij aby odrzucić życzenie nawiązania kontaktu"\n         ],\n         "Click to chat with this contact": [\n            null,\n            "Kliknij aby porozmawiać z kontaktem"\n         ],\n         "Name": [\n            null,\n            "Nazwa"\n         ],\n         "Are you sure you want to remove this contact?": [\n            null,\n            "Czy potwierdzasz zamiar usnunięcia tego kontaktu?"\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            "Wystąpił błąd w trakcie próby usunięcia "\n         ],\n         "Are you sure you want to decline this contact request?": [\n            null,\n            "Czy potwierdzasz odrzucenie chęci nawiązania kontaktu?"\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            "Wystąpił błąd w czasie próby dodania "\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            "Klient nie umożliwia subskrybcji obecności"\n         ],\n         "Type to filter": [\n            null,\n            "Zacznij pisać, aby odfiltrować"\n         ],\n         "I am %1$s": [\n            null,\n            "Jestem %1$s"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "Kliknij aby wpisać nowy status"\n         ],\n         "Click to change your chat status": [\n            null,\n            "Kliknij aby zmienić status rozmowy"\n         ],\n         "Custom status": [\n            null,\n            "Własny status"\n         ],\n         "online": [\n            null,\n            "dostępny"\n         ],\n         "busy": [\n            null,\n            "zajęty"\n         ],\n         "away for long": [\n            null,\n            "dłużej nieobecny"\n         ],\n         "away": [\n            null,\n            "nieobecny"\n         ],\n         "offline": [\n            null,\n            "rozłączony"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            "Domena twojego dostawcy XMPP:"\n         ],\n         "Fetch registration form": [\n            null,\n            "Pobierz formularz rejestracyjny"\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            "Wskazówka: dostępna jest lista publicznych dostawców XMPP"\n         ],\n         "here": [\n            null,\n            "tutaj"\n         ],\n         "Register": [\n            null,\n            "Zarejestruj"\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            "Przepraszamy, ale podany dostawca nie obsługuje rejestracji. Spróbuj wskazać innego dostawcę."\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            "Pobieranie formularza rejestracyjnego z serwera XMPP"\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            "Coś nie zadziałało przy próbie połączenia z \\"%1$s\\". Jesteś pewien że istnieje?"\n         ],\n         "Now logging you in": [\n            null,\n            "Teraz jesteś logowany"\n         ],\n         "Registered successfully": [\n            null,\n            "Szczęśliwie zarejestrowany"\n         ],\n         "Return": [\n            null,\n            "Powrót"\n         ],\n         "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n            null,\n            "Dostawca odrzucił twoją próbę rejestracji. Sprawdź proszę poprawność danych które zostały wprowadzone."\n         ],\n         "XMPP Username:": [\n            null,\n            "Nazwa użytkownika XMPP:"\n         ],\n         "Password:": [\n            null,\n            "Hasło:"\n         ],\n         "Click here to log in anonymously": [\n            null,\n            "Kliknij tutaj aby zalogować się anonimowo"\n         ],\n         "Log In": [\n            null,\n            "Zaloguj się"\n         ],\n         "user@server": [\n            null,\n            "user@server"\n         ],\n         "password": [\n            null,\n            "hasło"\n         ],\n         "Sign in": [\n            null,\n            "Zarejestruj się"\n         ],\n         "Toggle chat": [\n            null,\n            "Przełącz rozmowę"\n         ]\n      }\n   }\n}'}),define("text!pt_BR",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "plural_forms": "nplurals=2; plural=(n > 1);",\n            "lang": "pt_BR"\n         },\n         " e.g. conversejs.org": [\n            null,\n            ""\n         ],\n         "unencrypted": [\n            null,\n            "não-criptografado"\n         ],\n         "unverified": [\n            null,\n            "não-verificado"\n         ],\n         "verified": [\n            null,\n            "verificado"\n         ],\n         "finished": [\n            null,\n            "finalizado"\n         ],\n         "This contact is busy": [\n            null,\n            "Este contato está ocupado"\n         ],\n         "This contact is online": [\n            null,\n            "Este contato está online"\n         ],\n         "This contact is offline": [\n            null,\n            "Este contato está offline"\n         ],\n         "This contact is unavailable": [\n            null,\n            "Este contato está indisponível"\n         ],\n         "This contact is away for an extended period": [\n            null,\n            "Este contato está ausente por um longo período"\n         ],\n         "This contact is away": [\n            null,\n            "Este contato está ausente"\n         ],\n         "My contacts": [\n            null,\n            "Meus contatos"\n         ],\n         "Pending contacts": [\n            null,\n            "Contados pendentes"\n         ],\n         "Contact requests": [\n            null,\n            "Solicitação de contatos"\n         ],\n         "Ungrouped": [\n            null,\n            ""\n         ],\n         "Contacts": [\n            null,\n            "Contatos"\n         ],\n         "Groups": [\n            null,\n            ""\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            ""\n         ],\n         "Error": [\n            null,\n            "Erro"\n         ],\n         "Connecting": [\n            null,\n            "Conectando"\n         ],\n         "Authenticating": [\n            null,\n            "Autenticando"\n         ],\n         "Authentication Failed": [\n            null,\n            "Falha de autenticação"\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            "Reestabelecendo sessão criptografada"\n         ],\n         "Generating private key.": [\n            null,\n            "Gerando chave-privada."\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            "Seu navegador pode parar de responder."\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            "Não foi possível verificar a identidade deste usuário."\n         ],\n         "Minimize this chat box": [\n            null,\n            ""\n         ],\n         "Personal message": [\n            null,\n            "Mensagem pessoal"\n         ],\n         "me": [\n            null,\n            "eu"\n         ],\n         "Show this menu": [\n            null,\n            "Mostrar o menu"\n         ],\n         "Write in the third person": [\n            null,\n            "Escrever em terceira pessoa"\n         ],\n         "Remove messages": [\n            null,\n            "Remover mensagens"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            "Tem certeza que deseja limpar as mensagens dessa caixa?"\n         ],\n         "Your message could not be sent": [\n            null,\n            "Sua mensagem não pode ser enviada"\n         ],\n         "We received an unencrypted message": [\n            null,\n            "Recebemos uma mensagem não-criptografada"\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            "Recebemos uma mensagem não-criptografada ilegível"\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            "Aqui estão as assinaturas digitais, por favor confirme elas com %1$s, fora deste chat.\\n\\nAssinatura para você, %2$s: %3$s\\n\\nAssinatura para %1$s: %4$s\\n\\nSe você tiver confirmado que as assinaturas conferem, clique OK, caso contrário, clique Cancelar."\n         ],\n         "What is your security question?": [\n            null,\n            "Qual é a sua pergunta de segurança?"\n         ],\n         "What is the answer to the security question?": [\n            null,\n            "Qual é a resposta para a pergunta de segurança?"\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            "Schema de autenticação fornecido é inválido"\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            "Suas mensagens não estão mais criptografadas"\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            "Suas mensagens não estão criptografadas. Clique aqui para habilitar criptografia OTR."\n         ],\n         "End encrypted conversation": [\n            null,\n            "Finalizar conversa criptografada"\n         ],\n         "Insert a smiley": [\n            null,\n            ""\n         ],\n         "Hide the list of occupants": [\n            null,\n            ""\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            "Atualizar conversa criptografada"\n         ],\n         "Start a call": [\n            null,\n            ""\n         ],\n         "Start encrypted conversation": [\n            null,\n            "Iniciar conversa criptografada"\n         ],\n         "Verify with fingerprints": [\n            null,\n            "Verificar com assinatura digital"\n         ],\n         "Verify with SMP": [\n            null,\n            "Verificar com SMP"\n         ],\n         "What\'s this?": [\n            null,\n            "O que é isso?"\n         ],\n         "Online": [\n            null,\n            "Online"\n         ],\n         "Busy": [\n            null,\n            "Ocupado"\n         ],\n         "Away": [\n            null,\n            "Ausente"\n         ],\n         "Offline": [\n            null,\n            "Offline"\n         ],\n         "Contact name": [\n            null,\n            "Nome do contato"\n         ],\n         "Search": [\n            null,\n            "Procurar"\n         ],\n         "e.g. user@example.com": [\n            null,\n            ""\n         ],\n         "Add": [\n            null,\n            "Adicionar"\n         ],\n         "Click to add new chat contacts": [\n            null,\n            "Clique para adicionar novos contatos ao chat"\n         ],\n         "Add a contact": [\n            null,\n            "Adicionar contato"\n         ],\n         "No users found": [\n            null,\n            "Não foram encontrados usuários"\n         ],\n         "Click to add as a chat contact": [\n            null,\n            "Clique para adicionar como um contato do chat"\n         ],\n         "Room name": [\n            null,\n            "Nome da sala"\n         ],\n         "Nickname": [\n            null,\n            "Apelido"\n         ],\n         "Server": [\n            null,\n            "Server"\n         ],\n         "Show rooms": [\n            null,\n            "Mostar salas"\n         ],\n         "Rooms": [\n            null,\n            "Salas"\n         ],\n         "No rooms on %1$s": [\n            null,\n            "Sem salas em %1$s"\n         ],\n         "Rooms on %1$s": [\n            null,\n            "Salas em %1$s"\n         ],\n         "Click to open this room": [\n            null,\n            "CLique para abrir a sala"\n         ],\n         "Show more information on this room": [\n            null,\n            "Mostrar mais informações nessa sala"\n         ],\n         "Description:": [\n            null,\n            "Descrição:"\n         ],\n         "Occupants:": [\n            null,\n            "Ocupantes:"\n         ],\n         "Features:": [\n            null,\n            "Recursos:"\n         ],\n         "Requires authentication": [\n            null,\n            "Requer autenticação"\n         ],\n         "Hidden": [\n            null,\n            "Escondido"\n         ],\n         "Requires an invitation": [\n            null,\n            "Requer um convite"\n         ],\n         "Moderated": [\n            null,\n            "Moderado"\n         ],\n         "Non-anonymous": [\n            null,\n            "Não anônimo"\n         ],\n         "Open room": [\n            null,\n            "Sala aberta"\n         ],\n         "Permanent room": [\n            null,\n            "Sala permanente"\n         ],\n         "Public": [\n            null,\n            "Público"\n         ],\n         "Semi-anonymous": [\n            null,\n            "Semi anônimo"\n         ],\n         "Temporary room": [\n            null,\n            "Sala temporária"\n         ],\n         "Unmoderated": [\n            null,\n            "Sem moderação"\n         ],\n         "This user is a moderator": [\n            null,\n            "Esse usuário é o moderador"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "Esse usuário pode enviar mensagens nessa sala"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "Esse usuário NÃO pode enviar mensagens nessa sala"\n         ],\n         "Invite...": [\n            null,\n            ""\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            ""\n         ],\n         "You may optionally include a message, explaining the reason for the invitation.": [\n            null,\n            ""\n         ],\n         "Message": [\n            null,\n            "Mensagem"\n         ],\n         "Error: could not execute the command": [\n            null,\n            ""\n         ],\n         "Error: the \\"": [\n            null,\n            ""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            ""\n         ],\n         "Change user role to occupant": [\n            null,\n            ""\n         ],\n         "Grant membership to a user": [\n            null,\n            ""\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            ""\n         ],\n         "Change your nickname": [\n            null,\n            ""\n         ],\n         "Grant moderator role to user": [\n            null,\n            ""\n         ],\n         "Revoke user\'s membership": [\n            null,\n            ""\n         ],\n         "Allow muted user to post messages": [\n            null,\n            ""\n         ],\n         "Save": [\n            null,\n            "Salvar"\n         ],\n         "Cancel": [\n            null,\n            "Cancelar"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "Ocorreu um erro enquanto tentava salvar o formulário"\n         ],\n         "This chatroom requires a password": [\n            null,\n            "Esse chat precisa de senha"\n         ],\n         "Password: ": [\n            null,\n            "Senha: "\n         ],\n         "Submit": [\n            null,\n            "Enviar"\n         ],\n         "This room is not anonymous": [\n            null,\n            "Essa sala não é anônima"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            "Agora esta sala mostra membros indisponíveis"\n         ],\n         "This room does not show unavailable members": [\n            null,\n            "Essa sala não mostra membros indisponíveis"\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            "Configuraçõs não relacionadas à privacidade mudaram"\n         ],\n         "Room logging is now enabled": [\n            null,\n            "O log da sala está ativado"\n         ],\n         "Room logging is now disabled": [\n            null,\n            "O log da sala está desativado"\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "Esse sala é não anônima"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "Essa sala agora é semi anônima"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "Essa sala agora é totalmente anônima"\n         ],\n         "A new room has been created": [\n            null,\n            "Uma nova sala foi criada"\n         ],\n         "You have been banned from this room": [\n            null,\n            "Você foi banido dessa sala"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "Você foi expulso dessa sala"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            "Você foi removido da sala devido a uma mudança de associação"\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            "Você foi removido da sala porque ela foi mudada para somente membrose você não é um membro"\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            "Você foi removido da sala devido a MUC (Multi-user chat)o serviço está sendo desligado"\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "<strong>%1$s</strong> foi banido"\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "<strong>%1$s</strong> foi expulso"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            "<srtong>%1$s</strong> foi removido por causa de troca de associação"\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            "<strong>%1$s</strong> foi removido por não ser um membro"\n         ],\n         "The reason given is: \\"": [\n            null,\n            ""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "Você não é membro dessa sala"\n         ],\n         "No nickname was specified": [\n            null,\n            "Você não escolheu um apelido "\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "Você não tem permitição de criar novas salas"\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "Seu apelido não está de acordo com as regras da sala"\n         ],\n         "Your nickname is already taken": [\n            null,\n            "Seu apelido já foi escolhido"\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "A sala não existe (ainda)"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "A sala atingiu o número máximo de ocupantes"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            "Topico definido por %1$s para: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            ""\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            ""\n         ],\n         "Minimized": [\n            null,\n            "Minimizado"\n         ],\n         "Click to remove this contact": [\n            null,\n            "Clique para remover o contato"\n         ],\n         "Click to chat with this contact": [\n            null,\n            "Clique para conversar com o contato"\n         ],\n         "Name": [\n            null,\n            ""\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            ""\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            ""\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            ""\n         ],\n         "Type to filter": [\n            null,\n            ""\n         ],\n         "I am %1$s": [\n            null,\n            "Estou %1$s"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "Clique aqui para customizar a mensagem de status"\n         ],\n         "Click to change your chat status": [\n            null,\n            "Clique para mudar seu status no chat"\n         ],\n         "Custom status": [\n            null,\n            "Status customizado"\n         ],\n         "online": [\n            null,\n            "online"\n         ],\n         "busy": [\n            null,\n            "ocupado"\n         ],\n         "away for long": [\n            null,\n            "ausente a bastante tempo"\n         ],\n         "away": [\n            null,\n            "ausente"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            ""\n         ],\n         "Fetch registration form": [\n            null,\n            ""\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            ""\n         ],\n         "here": [\n            null,\n            ""\n         ],\n         "Register": [\n            null,\n            ""\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            ""\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            ""\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            ""\n         ],\n         "Now logging you in": [\n            null,\n            ""\n         ],\n         "Registered successfully": [\n            null,\n            ""\n         ],\n         "Return": [\n            null,\n            ""\n         ],\n         "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n            null,\n            ""\n         ],\n         "Password:": [\n            null,\n            "Senha:"\n         ],\n         "Log In": [\n            null,\n            "Entrar"\n         ],\n         "user@server": [\n            null,\n            ""\n         ],\n         "Sign in": [\n            null,\n            "Conectar-se"\n         ],\n         "Toggle chat": [\n            null,\n            "Alternar bate-papo"\n         ]\n      }\n   }\n}'}),define("text!ru",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "lang": "ru"\n         },\n         " e.g. conversejs.org": [\n            null,\n            ""\n         ],\n         "unencrypted": [\n            null,\n            "не зашифровано"\n         ],\n         "unverified": [\n            null,\n            "непроверено"\n         ],\n         "verified": [\n            null,\n            "проверено"\n         ],\n         "finished": [\n            null,\n            "закончено"\n         ],\n         "This contact is busy": [\n            null,\n            "Занят"\n         ],\n         "This contact is online": [\n            null,\n            "В сети"\n         ],\n         "This contact is offline": [\n            null,\n            "Не в сети"\n         ],\n         "This contact is unavailable": [\n            null,\n            "Не доступен"\n         ],\n         "This contact is away for an extended period": [\n            null,\n            "На долго отошёл"\n         ],\n         "This contact is away": [\n            null,\n            "Отошёл"\n         ],\n         "My contacts": [\n            null,\n            "Контакты"\n         ],\n         "Pending contacts": [\n            null,\n            "Собеседники ожидающие авторизации"\n         ],\n         "Contact requests": [\n            null,\n            "Запросы на авторизацию"\n         ],\n         "Ungrouped": [\n            null,\n            ""\n         ],\n         "Contacts": [\n            null,\n            "Контакты"\n         ],\n         "Groups": [\n            null,\n            ""\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            ""\n         ],\n         "Error": [\n            null,\n            "Ошибка"\n         ],\n         "Connecting": [\n            null,\n            "Соединение"\n         ],\n         "Authenticating": [\n            null,\n            "Авторизация"\n         ],\n         "Authentication Failed": [\n            null,\n            "Не удалось авторизоваться"\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            ""\n         ],\n         "Generating private key.": [\n            null,\n            ""\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            ""\n         ],\n         "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n            null,\n            ""\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            ""\n         ],\n         "Exchanging private key with contact.": [\n            null,\n            ""\n         ],\n         "Minimize this chat box": [\n            null,\n            ""\n         ],\n         "Personal message": [\n            null,\n            "Введите сообщение"\n         ],\n         "me": [\n            null,\n            "Я"\n         ],\n         "is typing": [\n            null,\n            ""\n         ],\n         "has stopped typing": [\n            null,\n            ""\n         ],\n         "Show this menu": [\n            null,\n            "Показать это меню"\n         ],\n         "Write in the third person": [\n            null,\n            ""\n         ],\n         "Remove messages": [\n            null,\n            "Удалить сообщения"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            ""\n         ],\n         "Your message could not be sent": [\n            null,\n            "Ваше сообщение не послано"\n         ],\n         "We received an unencrypted message": [\n            null,\n            ""\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            ""\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            ""\n         ],\n         "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n            null,\n            ""\n         ],\n         "What is your security question?": [\n            null,\n            ""\n         ],\n         "What is the answer to the security question?": [\n            null,\n            ""\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            ""\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            "Ваши сообщения больше не шифруются"\n         ],\n         "Your contact has ended encryption on their end, you should do the same.": [\n            null,\n            ""\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            "Ваши сообщения не шифруются. Нажмите здесь чтобы настроить шифрование."\n         ],\n         "Your contact has closed their end of the private session, you should do the same": [\n            null,\n            ""\n         ],\n         "End encrypted conversation": [\n            null,\n            ""\n         ],\n         "Insert a smiley": [\n            null,\n            ""\n         ],\n         "Hide the list of occupants": [\n            null,\n            ""\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            ""\n         ],\n         "Start a call": [\n            null,\n            ""\n         ],\n         "Start encrypted conversation": [\n            null,\n            ""\n         ],\n         "Verify with fingerprints": [\n            null,\n            ""\n         ],\n         "Verify with SMP": [\n            null,\n            ""\n         ],\n         "What\'s this?": [\n            null,\n            "Что это?"\n         ],\n         "Online": [\n            null,\n            "В сети"\n         ],\n         "Busy": [\n            null,\n            "Занят"\n         ],\n         "Away": [\n            null,\n            "Отошёл"\n         ],\n         "Offline": [\n            null,\n            "Не в сети"\n         ],\n         "Contact name": [\n            null,\n            "Имя контакта"\n         ],\n         "Search": [\n            null,\n            "Поиск"\n         ],\n         "e.g. user@example.com": [\n            null,\n            ""\n         ],\n         "Add": [\n            null,\n            "Добавить"\n         ],\n         "Click to add new chat contacts": [\n            null,\n            "Добавить новую конференцию"\n         ],\n         "Add a contact": [\n            null,\n            "Добавть контакт"\n         ],\n         "No users found": [\n            null,\n            "Пользователи не найдены"\n         ],\n         "Click to add as a chat contact": [\n            null,\n            "Добавить контакт"\n         ],\n         "Room name": [\n            null,\n            "Имя конференции"\n         ],\n         "Nickname": [\n            null,\n            "Псевдоним"\n         ],\n         "Server": [\n            null,\n            "Сервер"\n         ],\n         "Show rooms": [\n            null,\n            "Обновить"\n         ],\n         "Rooms": [\n            null,\n            "Конфер."\n         ],\n         "No rooms on %1$s": [\n            null,\n            "Нет доступных конференций %1$s"\n         ],\n         "Rooms on %1$s": [\n            null,\n            "Конференции %1$s:"\n         ],\n         "Click to open this room": [\n            null,\n            "Зайти в конференцию"\n         ],\n         "Show more information on this room": [\n            null,\n            "Показать больше информации об этой конференции"\n         ],\n         "Description:": [\n            null,\n            "Описание:"\n         ],\n         "Occupants:": [\n            null,\n            "Участники:"\n         ],\n         "Features:": [\n            null,\n            "Свойства:"\n         ],\n         "Requires authentication": [\n            null,\n            "Требуется авторизация"\n         ],\n         "Hidden": [\n            null,\n            "Скрыто"\n         ],\n         "Requires an invitation": [\n            null,\n            "Требуется приглашение"\n         ],\n         "Moderated": [\n            null,\n            "Модерируемая"\n         ],\n         "Non-anonymous": [\n            null,\n            "Не анонимная"\n         ],\n         "Open room": [\n            null,\n            "Открыть конференцию"\n         ],\n         "Permanent room": [\n            null,\n            "Перманентная конференция"\n         ],\n         "Public": [\n            null,\n            "Публичный"\n         ],\n         "Semi-anonymous": [\n            null,\n            "Частично анонимная"\n         ],\n         "Temporary room": [\n            null,\n            "Временная конференция"\n         ],\n         "Unmoderated": [\n            null,\n            "Немодерируемая"\n         ],\n         "This user is a moderator": [\n            null,\n            "Модератор"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "Собеседник"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "Пользователь не может посылать сообщения в эту комнату"\n         ],\n         "Invite...": [\n            null,\n            ""\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            ""\n         ],\n         "You may optionally include a message, explaining the reason for the invitation.": [\n            null,\n            ""\n         ],\n         "Message": [\n            null,\n            "Сообщение"\n         ],\n         "Error: could not execute the command": [\n            null,\n            ""\n         ],\n         "Error: the \\"": [\n            null,\n            ""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            ""\n         ],\n         "Change user role to occupant": [\n            null,\n            ""\n         ],\n         "Write in 3rd person": [\n            null,\n            ""\n         ],\n         "Grant membership to a user": [\n            null,\n            ""\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            ""\n         ],\n         "Change your nickname": [\n            null,\n            ""\n         ],\n         "Grant moderator role to user": [\n            null,\n            ""\n         ],\n         "Revoke user\'s membership": [\n            null,\n            ""\n         ],\n         "Allow muted user to post messages": [\n            null,\n            ""\n         ],\n         "Save": [\n            null,\n            "Сохранить"\n         ],\n         "Cancel": [\n            null,\n            "Отменить"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "При сохранение формы произошла ошибка."\n         ],\n         "This chatroom requires a password": [\n            null,\n            "Для доступа в конфер. необходим пароль."\n         ],\n         "Password: ": [\n            null,\n            "Пароль: "\n         ],\n         "Submit": [\n            null,\n            "Отправить"\n         ],\n         "This room is not anonymous": [\n            null,\n            "Эта комната не анонимная"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            "Эта комната показывает доступных собеседников"\n         ],\n         "This room does not show unavailable members": [\n            null,\n            "Эта комната не показывает недоступных собеседников"\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            ""\n         ],\n         "Room logging is now enabled": [\n            null,\n            ""\n         ],\n         "Room logging is now disabled": [\n            null,\n            ""\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "Эта комната не анонимная"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "Эта комната частично анонимная"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "Эта комната стала полностью анонимной"\n         ],\n         "A new room has been created": [\n            null,\n            "Новая комната была создана"\n         ],\n         "You have been banned from this room": [\n            null,\n            "Вам запрещено подключатся к этой конференции"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "Вам запрещено подключатся к этой конференции"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            "<strong>%1$s</strong> удалён потому что изменились права"\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            "Вы отключены от этой конференции потому что режим изменился: только-участники"\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            "Вы отключены от этой конференции потому что сервись конференций выключен."\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "<strong>%1$s</strong> забанен"\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "<strong>%1$s</strong> выдворен"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            "<strong>%1$s</strong> has been removed because of an affiliation change"\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            "<strong>%1$s</strong> удалён потому что не участник"\n         ],\n         "The reason given is: \\"": [\n            null,\n            ""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "Вас нет в списке этой конференции"\n         ],\n         "No nickname was specified": [\n            null,\n            "Вы не указали псевдоним"\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "Вы не имеете права создавать конфер."\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "Псевдоним не согласуется с правилами конфер."\n         ],\n         "Your nickname is already taken": [\n            null,\n            "Ваш ник уже используется другим пользователем"\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "Эта комната не существует"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "Конференция достигла максимального количества участников"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            "Тема %2$s устатновлена %1$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            ""\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            ""\n         ],\n         "Minimized": [\n            null,\n            ""\n         ],\n         "Click to remove this contact": [\n            null,\n            "Удалить контакт"\n         ],\n         "Click to chat with this contact": [\n            null,\n            "Начать общение"\n         ],\n         "Name": [\n            null,\n            ""\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            ""\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            ""\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            ""\n         ],\n         "Type to filter": [\n            null,\n            ""\n         ],\n         "I am %1$s": [\n            null,\n            "%1$s"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "Редактировать произвольный статус"\n         ],\n         "Click to change your chat status": [\n            null,\n            "Изменить ваш статус"\n         ],\n         "Custom status": [\n            null,\n            "Произвольный статус"\n         ],\n         "online": [\n            null,\n            "на связи"\n         ],\n         "busy": [\n            null,\n            "занят"\n         ],\n         "away for long": [\n            null,\n            "отошёл на долго"\n         ],\n         "away": [\n            null,\n            "отошёл"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            ""\n         ],\n         "Fetch registration form": [\n            null,\n            ""\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            ""\n         ],\n         "here": [\n            null,\n            ""\n         ],\n         "Register": [\n            null,\n            ""\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            ""\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            ""\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            ""\n         ],\n         "Now logging you in": [\n            null,\n            ""\n         ],\n         "Registered successfully": [\n            null,\n            ""\n         ],\n         "Return": [\n            null,\n            ""\n         ],\n         "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n            null,\n            ""\n         ],\n         "Password:": [\n            null,\n            "Пароль:"\n         ],\n         "Log In": [\n            null,\n            "Войти"\n         ],\n         "user@server": [\n            null,\n            ""\n         ],\n         "Sign in": [\n            null,\n            "Подписать"\n         ],\n         "Toggle chat": [\n            null,\n            ""\n         ]\n      }\n   }\n}'}),define("text!uk",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "plural_forms": "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);",\n            "lang": "uk"\n         },\n         " e.g. conversejs.org": [\n            null,\n            " напр. conversejs.org"\n         ],\n         "unencrypted": [\n            null,\n            "некриптовано"\n         ],\n         "unverified": [\n            null,\n            "неперевірено"\n         ],\n         "verified": [\n            null,\n            "перевірено"\n         ],\n         "finished": [\n            null,\n            "завершено"\n         ],\n         "This contact is busy": [\n            null,\n            "Цей контакт зайнятий"\n         ],\n         "This contact is online": [\n            null,\n            "Цей контакт на зв\'язку"\n         ],\n         "This contact is offline": [\n            null,\n            "Цей контакт поза мережею"\n         ],\n         "This contact is unavailable": [\n            null,\n            "Цей контакт недоступний"\n         ],\n         "This contact is away for an extended period": [\n            null,\n            "Цей контакт відсутній тривалий час"\n         ],\n         "This contact is away": [\n            null,\n            "Цей контакт відсутній"\n         ],\n         "Click to hide these contacts": [\n            null,\n            "Клацніть, щоб приховати ці контакти"\n         ],\n         "My contacts": [\n            null,\n            "Мої контакти"\n         ],\n         "Pending contacts": [\n            null,\n            "Контакти в очікуванні"\n         ],\n         "Contact requests": [\n            null,\n            "Запити контакту"\n         ],\n         "Ungrouped": [\n            null,\n            "Негруповані"\n         ],\n         "Contacts": [\n            null,\n            "Контакти"\n         ],\n         "Groups": [\n            null,\n            "Групи"\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            ""\n         ],\n         "Error": [\n            null,\n            "Помилка"\n         ],\n         "Connecting": [\n            null,\n            "Під\'єднуюсь"\n         ],\n         "Authenticating": [\n            null,\n            "Автентикуюсь"\n         ],\n         "Authentication Failed": [\n            null,\n            "Автентикація невдала"\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            "Перевстановлюю криптований сеанс"\n         ],\n         "Generating private key.": [\n            null,\n            "Генерація приватного ключа."\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            "Ваш браузер може підвиснути."\n         ],\n         "Authentication request from %1$s\\n\\nYour chat contact is attempting to verify your identity, by asking you the question below.\\n\\n%2$s": [\n            null,\n            "Запит автентикації від %1$s\\n\\nВаш контакт в чаті намагається встановити Вашу особу і просить відповісти на питання нижче.\\n\\n%2$s"\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            "Не можу перевірити автентичність цього користувача."\n         ],\n         "Exchanging private key with contact.": [\n            null,\n            "Обмін приватним ключем з контактом."\n         ],\n         "Minimize this chat box": [\n            null,\n            ""\n         ],\n         "Personal message": [\n            null,\n            "Персональна вісточка"\n         ],\n         "Are you sure you want to clear the messages from this room?": [\n            null,\n            "Ви впевнені, що хочете очистити повідомлення з цієї кімнати?"\n         ],\n         "me": [\n            null,\n            "я"\n         ],\n         "is typing": [\n            null,\n            "друкує"\n         ],\n         "has stopped typing": [\n            null,\n            "припинив друкувати"\n         ],\n         "has gone away": [\n            null,\n            "пішов геть"\n         ],\n         "Show this menu": [\n            null,\n            "Показати це меню"\n         ],\n         "Write in the third person": [\n            null,\n            "Писати від третьої особи"\n         ],\n         "Remove messages": [\n            null,\n            "Видалити повідомлення"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            "Ви впевнені, що хочете очистити повідомлення з цього вікна чату?"\n         ],\n         "Your message could not be sent": [\n            null,\n            "Ваше повідомлення не може бути надіслане"\n         ],\n         "We received an unencrypted message": [\n            null,\n            "Ми отримали некриптоване повідомлення"\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            "Ми отримали нечитабельне криптоване повідомлення"\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            "Ось відбитки, будь-ласка, підтвердіть їх з %1$s, за межами цього чату.\\n\\nВідбиток для Вас, %2$s: %3$s\\n\\nВідбиток для %1$s: %4$s\\n\\nЯкщо Ви підтверджуєте відповідність відбитка, клацніть Гаразд, інакше клацніть Відміна."\n         ],\n         "You will be prompted to provide a security question and then an answer to that question.\\n\\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.": [\n            null,\n            "Вас запитають таємне питання і відповідь на нього.\\n\\nПотім Вашого контакта запитають те саме питання, і якщо вони введуть ту саму відповідь (враховуючи регістр), їх особи будуть перевірені."\n         ],\n         "What is your security question?": [\n            null,\n            "Яке Ваше таємне питання?"\n         ],\n         "What is the answer to the security question?": [\n            null,\n            "Яка відповідь на таємне питання?"\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            "Надана некоректна схема автентикації"\n         ],\n         "has gone offline": [\n            null,\n            "тепер поза мережею"\n         ],\n         "is busy": [\n            null,\n            "зайнятий"\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            "Ваші повідомлення більше не криптуються"\n         ],\n         "Your messages are now encrypted but your contact\'s identity has not been verified.": [\n            null,\n            "Ваші повідомлення вже криптуються, але особа Вашого контакту не перевірена."\n         ],\n         "Your contact\'s identify has been verified.": [\n            null,\n            "Особу Вашого контакту перевірено."\n         ],\n         "Your contact has ended encryption on their end, you should do the same.": [\n            null,\n            "Ваш контакт припинив криптування зі свого боку, Вам слід зробити те саме."\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            "Ваші повідомлення не криптуються. Клацніть тут, щоб увімкнути OTR-криптування."\n         ],\n         "Your messages are encrypted, but your contact has not been verified.": [\n            null,\n            "Ваші повідомлення криптуються, але Ваш контакт не був перевірений."\n         ],\n         "Your messages are encrypted and your contact verified.": [\n            null,\n            "Ваші повідомлення криптуються і Ваш контакт перевірено."\n         ],\n         "Your contact has closed their end of the private session, you should do the same": [\n            null,\n            "Ваш контакт закрив зі свого боку приватну сесію, Вам слід зробити те ж саме"\n         ],\n         "Clear all messages": [\n            null,\n            "Очистити всі повідомлення"\n         ],\n         "End encrypted conversation": [\n            null,\n            "Завершити криптовану розмову"\n         ],\n         "Insert a smiley": [\n            null,\n            ""\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            "Оновити криптовану розмову"\n         ],\n         "Start a call": [\n            null,\n            "Почати виклик"\n         ],\n         "Start encrypted conversation": [\n            null,\n            "Почати криптовану розмову"\n         ],\n         "Verify with fingerprints": [\n            null,\n            "Перевірити за відбитками"\n         ],\n         "Verify with SMP": [\n            null,\n            "Перевірити за SMP"\n         ],\n         "What\'s this?": [\n            null,\n            "Що це?"\n         ],\n         "Online": [\n            null,\n            "На зв\'язку"\n         ],\n         "Busy": [\n            null,\n            "Зайнятий"\n         ],\n         "Away": [\n            null,\n            "Далеко"\n         ],\n         "Offline": [\n            null,\n            "Поза мережею"\n         ],\n         "Log out": [\n            null,\n            "Вийти"\n         ],\n         "Contact name": [\n            null,\n            "Назва контакту"\n         ],\n         "Search": [\n            null,\n            "Пошук"\n         ],\n         "e.g. user@example.com": [\n            null,\n            ""\n         ],\n         "Add": [\n            null,\n            "Додати"\n         ],\n         "Click to add new chat contacts": [\n            null,\n            "Клацніть, щоб додати нові контакти до чату"\n         ],\n         "Add a contact": [\n            null,\n            "Додати контакт"\n         ],\n         "No users found": [\n            null,\n            "Жодного користувача не знайдено"\n         ],\n         "Click to add as a chat contact": [\n            null,\n            "Клацніть, щоб додати як чат-контакт"\n         ],\n         "Room name": [\n            null,\n            "Назва кімнати"\n         ],\n         "Nickname": [\n            null,\n            "Прізвисько"\n         ],\n         "Server": [\n            null,\n            "Сервер"\n         ],\n         "Join Room": [\n            null,\n            "Приєднатися до кімнати"\n         ],\n         "Show rooms": [\n            null,\n            "Показати кімнати"\n         ],\n         "Rooms": [\n            null,\n            "Кімнати"\n         ],\n         "No rooms on %1$s": [\n            null,\n            "Жодної кімнати на %1$s"\n         ],\n         "Rooms on %1$s": [\n            null,\n            "Кімнати на %1$s"\n         ],\n         "Click to open this room": [\n            null,\n            "Клацніть, щоб увійти в цю кімнату"\n         ],\n         "Show more information on this room": [\n            null,\n            "Показати більше інформації про цю кімату"\n         ],\n         "Description:": [\n            null,\n            "Опис:"\n         ],\n         "Occupants:": [\n            null,\n            "Присутні:"\n         ],\n         "Features:": [\n            null,\n            "Особливості:"\n         ],\n         "Requires authentication": [\n            null,\n            "Вимагає автентикації"\n         ],\n         "Hidden": [\n            null,\n            "Прихована"\n         ],\n         "Requires an invitation": [\n            null,\n            "Вимагає запрошення"\n         ],\n         "Moderated": [\n            null,\n            "Модерована"\n         ],\n         "Non-anonymous": [\n            null,\n            "Не-анонімні"\n         ],\n         "Open room": [\n            null,\n            "Увійти в кімнату"\n         ],\n         "Permanent room": [\n            null,\n            "Постійна кімната"\n         ],\n         "Public": [\n            null,\n            "Публічна"\n         ],\n         "Semi-anonymous": [\n            null,\n            "Напів-анонімна"\n         ],\n         "Temporary room": [\n            null,\n            "Тимчасова кімната"\n         ],\n         "Unmoderated": [\n            null,\n            "Немодерована"\n         ],\n         "This user is a moderator": [\n            null,\n            "Цей користувач є модератором"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "Цей користувач може слати повідомлення в цій кімнаті"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "Цей користувач НЕ МОЖЕ слати повідомлення в цій кімнаті"\n         ],\n         "Invite...": [\n            null,\n            "Запросіть..."\n         ],\n         "Occupants": [\n            null,\n            "Учасники"\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            "Ви запрошуєте %1$s до чату \\"%2$s\\". "\n         ],\n         "You may optionally include a message, explaining the reason for the invitation.": [\n            null,\n            "Ви можете опціонально додати повідомлення, щоб пояснити причину запрошення."\n         ],\n         "Message": [\n            null,\n            "Повідомлення"\n         ],\n         "Error: could not execute the command": [\n            null,\n            "Помилка: Не можу виконати команду"\n         ],\n         "Error: the \\"": [\n            null,\n            ""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            "Призначити користувача адміністратором"\n         ],\n         "Ban user from room": [\n            null,\n            "Заблокувати і викинути з кімнати"\n         ],\n         "Kick user from room": [\n            null,\n            "Викинути з кімнати"\n         ],\n         "Write in 3rd person": [\n            null,\n            "Писати в 3-й особі"\n         ],\n         "Grant membership to a user": [\n            null,\n            "Надати членство користувачу"\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            "Забрати можливість слати повідомлення"\n         ],\n         "Change your nickname": [\n            null,\n            "Змінити Ваше прізвисько"\n         ],\n         "Grant moderator role to user": [\n            null,\n            "Надати права модератора"\n         ],\n         "Grant ownership of this room": [\n            null,\n            "Передати у власність цю кімнату"\n         ],\n         "Revoke user\'s membership": [\n            null,\n            "Забрати членство в користувача"\n         ],\n         "Set room topic": [\n            null,\n            "Встановити тему кімнати"\n         ],\n         "Allow muted user to post messages": [\n            null,\n            "Дозволити безголосому користувачу слати повідомлення"\n         ],\n         "Save": [\n            null,\n            "Зберегти"\n         ],\n         "Cancel": [\n            null,\n            "Відміна"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "Трапилася помилка при спробі зберегти форму."\n         ],\n         "This chatroom requires a password": [\n            null,\n            "Ця кімната вимагає пароль"\n         ],\n         "Password: ": [\n            null,\n            "Пароль:"\n         ],\n         "Submit": [\n            null,\n            "Надіслати"\n         ],\n         "This room is not anonymous": [\n            null,\n            "Ця кімната не є анонімною"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            "Ця кімната вже показує недоступних учасників"\n         ],\n         "This room does not show unavailable members": [\n            null,\n            "Ця кімната не показує недоступних учасників"\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            "Змінено конфігурацію кімнати, не повязану з приватністю"\n         ],\n         "Room logging is now enabled": [\n            null,\n            "Журналювання кімнати тепер ввімкнено"\n         ],\n         "Room logging is now disabled": [\n            null,\n            "Журналювання кімнати тепер вимкнено"\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "Ця кімната тепер не-анонімна"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "Ця кімната тепер напів-анонімна"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "Ця кімната тепер повністю анонімна"\n         ],\n         "A new room has been created": [\n            null,\n            "Створено нову кімнату"\n         ],\n         "You have been banned from this room": [\n            null,\n            "Вам заблокували доступ до цієї кімнати"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "Вас викинули з цієї кімнати"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            "Вас видалено з кімнати у зв\'язку зі змінами власності кімнати"\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            "Вас видалено з цієї кімнати, оскільки вона тепер вимагає членства, а Ви ним не є її членом"\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            "Вас видалено з цієї кімнати, тому що MUC (Чат-сервіс) припиняє роботу."\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "<strong>%1$s</strong> заблоковано"\n         ],\n         "<strong>%1$s</strong>\'s nickname has changed": [\n            null,\n            "Прізвисько <strong>%1$s</strong> змінено"\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "<strong>%1$s</strong> було викинуто звідси"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            "<strong>%1$s</strong> було видалено через зміни власності кімнати"\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            "<strong>%1$s</strong> було виделано через відсутність членства"\n         ],\n         "Your nickname has been automatically changed to: <strong>%1$s</strong>": [\n            null,\n            "Ваше прізвисько було автоматично змінене на: <strong>%1$s</strong>"\n         ],\n         "Your nickname has been changed to: <strong>%1$s</strong>": [\n            null,\n            "Ваше прізвисько було змінене на: <strong>%1$s</strong>"\n         ],\n         "The reason given is: \\"": [\n            null,\n            "Причиною вказано: \\""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "Ви не є у списку членів цієї кімнати"\n         ],\n         "No nickname was specified": [\n            null,\n            "Не вказане прізвисько"\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "Вам не дозволено створювати нові кімнати"\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "Ваше прізвисько не відповідає політиці кімнати"\n         ],\n         "Your nickname is already taken": [\n            null,\n            "Таке прізвисько вже зайняте"\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "Такої кімнати (поки) не існує"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "Ця кімната досягнула максимуму учасників"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            "Тема встановлена %1$s: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            "%1$s запрошує вас приєднатись до чату: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            "%1$s запрошує Вас приєднатись до чату: %2$s, аргументує ось як: \\"%3$s\\""\n         ],\n         "Click to restore this chat": [\n            null,\n            "Клацніть, щоб відновити цей чат"\n         ],\n         "Minimized": [\n            null,\n            "Мінімізовано"\n         ],\n         "Click to remove this contact": [\n            null,\n            "Клацніть, щоб видалити цей контакт"\n         ],\n         "Click to accept this contact request": [\n            null,\n            "Клацніть, щоб прийняти цей запит контакту"\n         ],\n         "Click to decline this contact request": [\n            null,\n            "Клацніть, щоб відхилити цей запит контакту"\n         ],\n         "Click to chat with this contact": [\n            null,\n            "Клацніть, щоб почати розмову з цим контактом"\n         ],\n         "Name": [\n            null,\n            ""\n         ],\n         "Are you sure you want to remove this contact?": [\n            null,\n            "Ви впевнені, що хочете видалити цей контакт?"\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            ""\n         ],\n         "Are you sure you want to decline this contact request?": [\n            null,\n            "Ви впевнені, що хочете відхилити цей запит контакту?"\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            ""\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            ""\n         ],\n         "Type to filter": [\n            null,\n            "Друкуйте для фільтру"\n         ],\n         "I am %1$s": [\n            null,\n            "Я %1$s"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "Клацніть тут, щоб створити власний статус"\n         ],\n         "Click to change your chat status": [\n            null,\n            "Клацніть, щоб змінити статус в чаті"\n         ],\n         "Custom status": [\n            null,\n            "Власний статус"\n         ],\n         "online": [\n            null,\n            "на зв\'язку"\n         ],\n         "busy": [\n            null,\n            "зайнятий"\n         ],\n         "away for long": [\n            null,\n            "давно відсутній"\n         ],\n         "away": [\n            null,\n            "відсутній"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            "Домен Вашого провайдера XMPP:"\n         ],\n         "Fetch registration form": [\n            null,\n            "Отримати форму реєстрації"\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            "Порада: доступний перелік публічних XMPP-провайдерів"\n         ],\n         "here": [\n            null,\n            "тут"\n         ],\n         "Register": [\n            null,\n            "Реєстрація"\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            "Вибачте, вказаний провайдер не підтримує реєстрації онлайн. Спробуйте іншого провайдера."\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            "Запитую форму реєстрації з XMPP сервера"\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            "Щось пішло не так при встановленні зв\'язку з \\"%1$s\\". Ви впевнені, що такий існує?"\n         ],\n         "Now logging you in": [\n            null,\n            "Входимо"\n         ],\n         "Registered successfully": [\n            null,\n            "Успішно зареєстровано"\n         ],\n         "Return": [\n            null,\n            "Вернутися"\n         ],\n         "XMPP Username:": [\n            null,\n            "XMPP адреса:"\n         ],\n         "Password:": [\n            null,\n            "Пароль:"\n         ],\n         "Log In": [\n            null,\n            "Ввійти"\n         ],\n         "user@server": [\n            null,\n            ""\n         ],\n         "Sign in": [\n            null,\n            "Вступити"\n         ],\n         "Toggle chat": [\n            null,\n            "Включити чат"\n         ]\n      }\n   }\n}'}),define("text!zh",[],function(){return'{\n   "domain": "converse",\n   "locale_data": {\n      "converse": {\n         "": {\n            "domain": "converse",\n            "lang": "zh"\n         },\n         " e.g. conversejs.org": [\n            null,\n            ""\n         ],\n         "unencrypted": [\n            null,\n            "未加密"\n         ],\n         "unverified": [\n            null,\n            "未验证"\n         ],\n         "verified": [\n            null,\n            "已验证"\n         ],\n         "finished": [\n            null,\n            "结束了"\n         ],\n         "This contact is busy": [\n            null,\n            "对方忙碌中"\n         ],\n         "This contact is online": [\n            null,\n            "对方在线中"\n         ],\n         "This contact is offline": [\n            null,\n            "对方已下线"\n         ],\n         "This contact is unavailable": [\n            null,\n            "对方免打扰"\n         ],\n         "This contact is away for an extended period": [\n            null,\n            "对方暂时离开"\n         ],\n         "This contact is away": [\n            null,\n            "对方离开"\n         ],\n         "My contacts": [\n            null,\n            "我的好友列表"\n         ],\n         "Pending contacts": [\n            null,\n            "保留中的联系人"\n         ],\n         "Contact requests": [\n            null,\n            "来自好友的请求"\n         ],\n         "Ungrouped": [\n            null,\n            ""\n         ],\n         "Contacts": [\n            null,\n            "联系人"\n         ],\n         "Groups": [\n            null,\n            ""\n         ],\n         "Attempting to reconnect in 5 seconds": [\n            null,\n            ""\n         ],\n         "Error": [\n            null,\n            "错误"\n         ],\n         "Connecting": [\n            null,\n            "连接中"\n         ],\n         "Authenticating": [\n            null,\n            "验证中"\n         ],\n         "Authentication Failed": [\n            null,\n            "验证失败"\n         ],\n         "Re-establishing encrypted session": [\n            null,\n            "重新建立加密会话"\n         ],\n         "Generating private key.": [\n            null,\n            "正在生成私钥"\n         ],\n         "Your browser might become unresponsive.": [\n            null,\n            "您的浏览器可能会暂时无响应"\n         ],\n         "Could not verify this user\'s identify.": [\n            null,\n            "无法验证对方信息。"\n         ],\n         "Minimize this chat box": [\n            null,\n            ""\n         ],\n         "Personal message": [\n            null,\n            "私信"\n         ],\n         "me": [\n            null,\n            "我"\n         ],\n         "is typing": [\n            null,\n            ""\n         ],\n         "has stopped typing": [\n            null,\n            ""\n         ],\n         "Show this menu": [\n            null,\n            "显示此项菜单"\n         ],\n         "Write in the third person": [\n            null,\n            "以第三者身份写"\n         ],\n         "Remove messages": [\n            null,\n            "移除消息"\n         ],\n         "Are you sure you want to clear the messages from this chat box?": [\n            null,\n            "你确定清除此次的聊天记录吗?"\n         ],\n         "Your message could not be sent": [\n            null,\n            "您的消息无法送出"\n         ],\n         "We received an unencrypted message": [\n            null,\n            "我们收到了一条未加密的信息"\n         ],\n         "We received an unreadable encrypted message": [\n            null,\n            "我们收到一条无法读取的信息"\n         ],\n         "Here are the fingerprints, please confirm them with %1$s, outside of this chat.\\n\\nFingerprint for you, %2$s: %3$s\\n\\nFingerprint for %1$s: %4$s\\n\\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.": [\n            null,\n            "这里是指纹。请与 %1$s 确认。\\n\\n您的 %2$s 指纹: %3$s\\n\\n%1$s 的指纹: %4$s\\n\\n如果确认符合,请点击OK,否则点击取消"\n         ],\n         "What is your security question?": [\n            null,\n            "您的安全问题是?"\n         ],\n         "What is the answer to the security question?": [\n            null,\n            "此安全问题的答案是?"\n         ],\n         "Invalid authentication scheme provided": [\n            null,\n            "非法的认证方式"\n         ],\n         "Your messages are not encrypted anymore": [\n            null,\n            "您的消息将不再被加密"\n         ],\n         "Your messages are not encrypted. Click here to enable OTR encryption.": [\n            null,\n            "您的消息未加密。点击这里来启用OTR加密"\n         ],\n         "End encrypted conversation": [\n            null,\n            "结束加密的会话"\n         ],\n         "Insert a smiley": [\n            null,\n            ""\n         ],\n         "Hide the list of occupants": [\n            null,\n            ""\n         ],\n         "Refresh encrypted conversation": [\n            null,\n            "刷新加密的会话"\n         ],\n         "Start a call": [\n            null,\n            ""\n         ],\n         "Start encrypted conversation": [\n            null,\n            "开始加密的会话"\n         ],\n         "Verify with fingerprints": [\n            null,\n            "验证指纹"\n         ],\n         "Verify with SMP": [\n            null,\n            "验证SMP"\n         ],\n         "What\'s this?": [\n            null,\n            "这是什么?"\n         ],\n         "Online": [\n            null,\n            "在线"\n         ],\n         "Busy": [\n            null,\n            "忙碌中"\n         ],\n         "Away": [\n            null,\n            "离开"\n         ],\n         "Offline": [\n            null,\n            "离线"\n         ],\n         "Contact name": [\n            null,\n            "联系人名称"\n         ],\n         "Search": [\n            null,\n            "搜索"\n         ],\n         "e.g. user@example.com": [\n            null,\n            ""\n         ],\n         "Add": [\n            null,\n            "添加"\n         ],\n         "Click to add new chat contacts": [\n            null,\n            "点击添加新联系人"\n         ],\n         "Add a contact": [\n            null,\n            "添加联系人"\n         ],\n         "No users found": [\n            null,\n            "未找到用户"\n         ],\n         "Click to add as a chat contact": [\n            null,\n            "点击添加为好友"\n         ],\n         "Room name": [\n            null,\n            "聊天室名称"\n         ],\n         "Nickname": [\n            null,\n            "昵称"\n         ],\n         "Server": [\n            null,\n            "服务器"\n         ],\n         "Show rooms": [\n            null,\n            "显示所有聊天室"\n         ],\n         "Rooms": [\n            null,\n            "聊天室"\n         ],\n         "No rooms on %1$s": [\n            null,\n            "%1$s 上没有聊天室"\n         ],\n         "Rooms on %1$s": [\n            null,\n            "%1$s 上的聊天室"\n         ],\n         "Click to open this room": [\n            null,\n            "打开聊天室"\n         ],\n         "Show more information on this room": [\n            null,\n            "显示次聊天室的更多信息"\n         ],\n         "Description:": [\n            null,\n            "描述: "\n         ],\n         "Occupants:": [\n            null,\n            "成员:"\n         ],\n         "Features:": [\n            null,\n            "特性:"\n         ],\n         "Requires authentication": [\n            null,\n            "需要验证"\n         ],\n         "Hidden": [\n            null,\n            "隐藏的"\n         ],\n         "Requires an invitation": [\n            null,\n            "需要被邀请"\n         ],\n         "Moderated": [\n            null,\n            "发言受限"\n         ],\n         "Non-anonymous": [\n            null,\n            "非匿名"\n         ],\n         "Open room": [\n            null,\n            "打开聊天室"\n         ],\n         "Permanent room": [\n            null,\n            "永久聊天室"\n         ],\n         "Public": [\n            null,\n            "公开的"\n         ],\n         "Semi-anonymous": [\n            null,\n            "半匿名"\n         ],\n         "Temporary room": [\n            null,\n            "临时聊天室"\n         ],\n         "Unmoderated": [\n            null,\n            "无发言限制"\n         ],\n         "This user is a moderator": [\n            null,\n            "此用户是主持人"\n         ],\n         "This user can send messages in this room": [\n            null,\n            "此用户在这房间里可发消息"\n         ],\n         "This user can NOT send messages in this room": [\n            null,\n            "此用户不可在此房间发消息"\n         ],\n         "Invite...": [\n            null,\n            ""\n         ],\n         "You are about to invite %1$s to the chat room \\"%2$s\\". ": [\n            null,\n            ""\n         ],\n         "You may optionally include a message, explaining the reason for the invitation.": [\n            null,\n            ""\n         ],\n         "Message": [\n            null,\n            "信息"\n         ],\n         "Error: could not execute the command": [\n            null,\n            ""\n         ],\n         "Error: the \\"": [\n            null,\n            ""\n         ],\n         "Change user\'s affiliation to admin": [\n            null,\n            ""\n         ],\n         "Change user role to occupant": [\n            null,\n            ""\n         ],\n         "Grant membership to a user": [\n            null,\n            ""\n         ],\n         "Remove user\'s ability to post messages": [\n            null,\n            ""\n         ],\n         "Change your nickname": [\n            null,\n            ""\n         ],\n         "Grant moderator role to user": [\n            null,\n            ""\n         ],\n         "Revoke user\'s membership": [\n            null,\n            ""\n         ],\n         "Allow muted user to post messages": [\n            null,\n            ""\n         ],\n         "Save": [\n            null,\n            "保存"\n         ],\n         "Cancel": [\n            null,\n            "取消"\n         ],\n         "An error occurred while trying to save the form.": [\n            null,\n            "保存表单是出错。"\n         ],\n         "This chatroom requires a password": [\n            null,\n            "此聊天室需要密码"\n         ],\n         "Password: ": [\n            null,\n            "密码:"\n         ],\n         "Submit": [\n            null,\n            "发送"\n         ],\n         "This room is not anonymous": [\n            null,\n            "此为非匿名聊天室"\n         ],\n         "This room now shows unavailable members": [\n            null,\n            "此聊天室显示不可用用户"\n         ],\n         "This room does not show unavailable members": [\n            null,\n            "此聊天室不显示不可用用户"\n         ],\n         "Non-privacy-related room configuration has changed": [\n            null,\n            "此聊天室设置(非私密性)已改变"\n         ],\n         "Room logging is now enabled": [\n            null,\n            "聊天室聊天记录已启用"\n         ],\n         "Room logging is now disabled": [\n            null,\n            "聊天室聊天记录已禁用"\n         ],\n         "This room is now non-anonymous": [\n            null,\n            "此聊天室非匿名"\n         ],\n         "This room is now semi-anonymous": [\n            null,\n            "此聊天室半匿名"\n         ],\n         "This room is now fully-anonymous": [\n            null,\n            "此聊天室完全匿名"\n         ],\n         "A new room has been created": [\n            null,\n            "新聊天室已创建"\n         ],\n         "You have been banned from this room": [\n            null,\n            "您已被此聊天室禁止入内"\n         ],\n         "You have been kicked from this room": [\n            null,\n            "您已被踢出次房间"\n         ],\n         "You have been removed from this room because of an affiliation change": [\n            null,\n            "由于关系变化,您已被移除此房间"\n         ],\n         "You have been removed from this room because the room has changed to members-only and you\'re not a member": [\n            null,\n            "您已被移除此房间因为此房间更改为只允许成员加入,而您非成员"\n         ],\n         "You have been removed from this room because the MUC (Multi-user chat) service is being shut down.": [\n            null,\n            "由于服务不可用,您已被移除此房间。"\n         ],\n         "<strong>%1$s</strong> has been banned": [\n            null,\n            "<strong>%1$s</strong> 已被禁止"\n         ],\n         "<strong>%1$s</strong> has been kicked out": [\n            null,\n            "<strong>%1$s</strong> 已被踢出"\n         ],\n         "<strong>%1$s</strong> has been removed because of an affiliation change": [\n            null,\n            "由于关系解除、<strong>%1$s</strong> 已被移除"\n         ],\n         "<strong>%1$s</strong> has been removed for not being a member": [\n            null,\n            "由于不是成员、<strong>%1$s</strong> 已被移除"\n         ],\n         "The reason given is: \\"": [\n            null,\n            ""\n         ],\n         "You are not on the member list of this room": [\n            null,\n            "您并非此房间成员"\n         ],\n         "No nickname was specified": [\n            null,\n            "未指定昵称"\n         ],\n         "You are not allowed to create new rooms": [\n            null,\n            "您可此创建新房间了"\n         ],\n         "Your nickname doesn\'t conform to this room\'s policies": [\n            null,\n            "您的昵称不符合此房间标准"\n         ],\n         "Your nickname is already taken": [\n            null,\n            "您的昵称已被占用"\n         ],\n         "This room does not (yet) exist": [\n            null,\n            "此房间不存在"\n         ],\n         "This room has reached it\'s maximum number of occupants": [\n            null,\n            "此房间人数已达上线"\n         ],\n         "Topic set by %1$s to: %2$s": [\n            null,\n            "%1$s 设置话题为: %2$s"\n         ],\n         "%1$s has invited you to join a chat room: %2$s": [\n            null,\n            ""\n         ],\n         "%1$s has invited you to join a chat room: %2$s, and left the following reason: \\"%3$s\\"": [\n            null,\n            ""\n         ],\n         "Minimized": [\n            null,\n            "最小化的"\n         ],\n         "Click to remove this contact": [\n            null,\n            "点击移除联系人"\n         ],\n         "Click to chat with this contact": [\n            null,\n            "点击与对方交谈"\n         ],\n         "Name": [\n            null,\n            ""\n         ],\n         "Sorry, there was an error while trying to remove ": [\n            null,\n            ""\n         ],\n         "Sorry, there was an error while trying to add ": [\n            null,\n            ""\n         ],\n         "This client does not allow presence subscriptions": [\n            null,\n            ""\n         ],\n         "Type to filter": [\n            null,\n            ""\n         ],\n         "I am %1$s": [\n            null,\n            "我现在%1$s"\n         ],\n         "Click here to write a custom status message": [\n            null,\n            "点击这里,填写状态信息"\n         ],\n         "Click to change your chat status": [\n            null,\n            "点击这里改变聊天状态"\n         ],\n         "Custom status": [\n            null,\n            "DIY状态"\n         ],\n         "online": [\n            null,\n            "在线"\n         ],\n         "busy": [\n            null,\n            "忙碌"\n         ],\n         "away for long": [\n            null,\n            "长时间离开"\n         ],\n         "away": [\n            null,\n            "离开"\n         ],\n         "Your XMPP provider\'s domain name:": [\n            null,\n            ""\n         ],\n         "Fetch registration form": [\n            null,\n            ""\n         ],\n         "Tip: A list of public XMPP providers is available": [\n            null,\n            ""\n         ],\n         "here": [\n            null,\n            ""\n         ],\n         "Register": [\n            null,\n            ""\n         ],\n         "Sorry, the given provider does not support in band account registration. Please try with a different provider.": [\n            null,\n            ""\n         ],\n         "Requesting a registration form from the XMPP server": [\n            null,\n            ""\n         ],\n         "Something went wrong while establishing a connection with \\"%1$s\\". Are you sure it exists?": [\n            null,\n            ""\n         ],\n         "Now logging you in": [\n            null,\n            ""\n         ],\n         "Registered successfully": [\n            null,\n            ""\n         ],\n         "Return": [\n            null,\n            ""\n         ],\n         "The provider rejected your registration attempt. Please check the values you entered for correctness.": [\n            null,\n            ""\n         ],\n         "Password:": [\n            null,\n            "密码:"\n         ],\n         "Log In": [\n            null,\n            "登录"\n         ],\n         "user@server": [\n            null,\n            ""\n         ],\n         "Sign in": [\n            null,\n            "登录"\n         ],\n         "Toggle chat": [\n            null,\n            "折叠聊天窗口"\n         ]\n      }\n   }\n}'}),function(e,t){define("locales",["jquery","jed","text!af","text!de","text!en","text!es","text!fr","text!he","text!hu","text!id","text!it","text!ja","text!nb","text!nl","text!pl","text!pt_BR","text!ru","text!uk","text!zh"],function(t,n){return e.locales={af:arguments[2],de:arguments[3],en:arguments[4],es:arguments[5],fr:arguments[6],he:arguments[7],hu:arguments[8],id:arguments[9],it:arguments[10],ja:arguments[11],nb:arguments[12],nl:arguments[13],pl:arguments[14],"pt-br":arguments[15],ru:arguments[16],uk:arguments[17],zh:arguments[18]},e.locales})}(this),function(e,t){typeof define=="function"&&define.amd?define("utils",["jquery","underscore","converse-templates","locales"],t):e.utils=t(jQuery,_,templates)}(this,function(e,t,n,r){"use strict";var i={"text-private":"password","text-single":"text",fixed:"label","boolean":"checkbox",hidden:"hidden","jid-multi":"textarea","list-single":"dropdown","list-multi":"dropdown"};e.expr[":"].emptyVal=function(e){return e.value===""},e.fn.hasScrollBar=function(){return e.contains(document,this.get(0))?this.parent().height()<this.get(0).scrollHeight?!0:!1:!1},e.fn.addHyperlinks=function(){return this.length>0&&this.each(function(t,n){var r=e(n).html(),i=r.match(/\b(https?:\/\/|www\.|https?:\/\/www\.)[^\s<]{2,200}\b/g);if(i)for(t=0;t<i.length;t++){var s=i[t].indexOf("http://")===0||i[t].indexOf("https://")===0?"":"http://",o=encodeURI(decodeURI(i[t])).replace(/[!'()]/g,escape).replace(/\*/g,"%2A");r=r.replace(i[t],"<a target='_blank' href='"+s+o+"'>"+i[t]+"</a>")}e(n).html(r)}),this},e.fn.addEmoticons=function(t){return t&&this.length>0&&this.each(function(t,n){var r=e(n).html();r=r.replace(/&gt;:\)/g,'<span class="emoticon icon-evil"></span>'),r=r.replace(/:\)/g,'<span class="emoticon icon-smiley"></span>'),r=r.replace(/:\-\)/g,'<span class="emoticon icon-smiley"></span>'),r=r.replace(/;\)/g,'<span class="emoticon icon-wink"></span>'),r=r.replace(/;\-\)/g,'<span class="emoticon icon-wink"></span>'),r=r.replace(/:D/g,'<span class="emoticon icon-grin"></span>'),r=r.replace(/:\-D/g,'<span class="emoticon icon-grin"></span>'),r=r.replace(/:P/g,'<span class="emoticon icon-tongue"></span>'),r=r.replace(/:\-P/g,'<span class="emoticon icon-tongue"></span>'),r=r.replace(/:p/g,'<span class="emoticon icon-tongue"></span>'),r=r.replace(/:\-p/g,'<span class="emoticon icon-tongue"></span>'),r=r.replace(/8\)/g,'<span class="emoticon icon-cool"></span>'),r=r.replace(/:S/g,'<span class="emoticon icon-confused"></span>'),r=r.replace(/:\\/g,'<span class="emoticon icon-wondering"></span>'),r=r.replace(/:\/ /g,'<span class="emoticon icon-wondering"></span>'),r=r.replace(/&gt;:\(/g,'<span class="emoticon icon-angry"></span>'),r=r.replace(/:\(/g,'<span class="emoticon icon-sad"></span>'),r=r.replace(/:\-\(/g,'<span class="emoticon icon-sad"></span>'),r=r.replace(/:O/g,'<span class="emoticon icon-shocked"></span>'),r=r.replace(/:\-O/g,'<span class="emoticon icon-shocked"></span>'),r=r.replace(/\=\-O/g,'<span class="emoticon icon-shocked"></span>'),r=r.replace(/\(\^.\^\)b/g,'<span class="emoticon icon-thumbs-up"></span>'),r=r.replace(/&lt;3/g,'<span class="emoticon icon-heart"></span>'),e(n).html(r)}),this};var s={__:function(t){typeof this.i18n=="undefined"&&(this.i18n=r.en),typeof this.i18n=="string"&&(this.i18n=e.parseJSON(this.i18n)),typeof this.jed=="undefined"&&(this.jed=new Jed(this.i18n));var n=this.jed.translate(t);return arguments.length>1?n.fetch.apply(n,[].slice.call(arguments,1)):n.fetch()},___:function(e){return e},webForm2xForm:function(t){var r=e(t),i;if(r.is("[type=checkbox]"))i=r.is(":checked")&&1||0;else if(r.is("textarea")){i=[];var s=r.val().split("\n");for(var o=0;o<s.length;o++){var u=e.trim(s[o]);if(u==="")continue;i.push(u)}}else i=r.val();return e(n.field({name:r.attr("name"),value:i}))[0]},xForm2webForm:function(r,s){var o=[],u,a,f,l,c;if(r.attr("type")==="list-single"||r.attr("type")==="list-multi"){c=[],f=r.children("value");for(u=0;u<f.length;u++)c.push(e(f[u]).text());a=r.children("option");for(u=0;u<a.length;u++)l=e(a[u]).find("value").text(),o.push(n.select_option({value:l,label:e(a[u]).attr("label"),selected:c.indexOf(l)>=0,required:r.find("required").length}));return n.form_select({name:r.attr("var"),label:r.attr("label"),options:o.join(""),multiple:r.attr("type")==="list-multi",required:r.find("required").length})}if(r.attr("type")==="fixed")return e('<p class="form-help">').text(r.find("value").text());if(r.attr("type")==="jid-multi")return n.form_textarea({name:r.attr("var"),label:r.attr("label")||"",value:r.find("value").text(),required:r.find("required").length});if(r.attr("type")==="boolean")return n.form_checkbox({name:r.attr("var"),type:i[r.attr("type")],label:r.attr("label")||"",checked:r.find("value").text()==="1"&&'checked="1"'||"",required:r.find("required").length});if(r.attr("type")&&r.attr("var")==="username")return n.form_username({domain:" @"+this.domain,name:r.attr("var"),type:i[r.attr("type")],label:r.attr("label")||"",value:r.find("value").text(),required:r.find("required").length});if(r.attr("type"))return n.form_input({name:r.attr("var"),type:i[r.attr("type")],label:r.attr("label")||"",value:r.find("value").text(),required:r.find("required").length});if(r.attr("var")==="ocr")return t.reduce(t.map(r.find("uri"),e.proxy(function(e){return n.form_captcha({label:this.$field.attr("label"),name:this.$field.attr("var"),data:this.$stanza.find('data[cid="'+e.textContent.replace(/^cid:/,"")+'"]').text(),type:e.getAttribute("type"),required:this.$field.find("required").length})},{$stanza:s,$field:r})),function(e,t){return e+t},"")}};return s}),function(e){typeof define=="function"&&define.amd?define("jquery.browser",["jquery"],function(t){return e(t)}):typeof module=="object"&&typeof module.exports=="object"?module.exports=e(require("jquery")):e(window.jQuery)}(function(e){"use strict";function t(e){e===undefined&&(e=window.navigator.userAgent),e=e.toLowerCase();var t=/(edge)\/([\w.]+)/.exec(e)||/(opr)[\/]([\w.]+)/.exec(e)||/(chrome)[ \/]([\w.]+)/.exec(e)||/(version)(applewebkit)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+).*(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("trident")>=0&&/(rv)(?::| )([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[],n=/(ipad)/.exec(e)||/(ipod)/.exec(e)||/(iphone)/.exec(e)||/(kindle)/.exec(e)||/(silk)/.exec(e)||/(android)/.exec(e)||/(windows phone)/.exec(e)||/(win)/.exec(e)||/(mac)/.exec(e)||/(linux)/.exec(e)||/(cros)/.exec(e)||/(playbook)/.exec(e)||/(bb)/.exec(e)||/(blackberry)/.exec(e)||[],r={},i={browser:t[5]||t[3]||t[1]||"",version:t[2]||t[4]||"0",versionNumber:t[4]||t[2]||"0",platform:n[0]||""};i.browser&&(r[i.browser]=!0,r.version=i.version,r.versionNumber=parseInt(i.versionNumber,10)),i.platform&&(r[i.platform]=!0);if(r.android||r.bb||r.blackberry||r.ipad||r.iphone||r.ipod||r.kindle||r.playbook||r.silk||r["windows phone"])r.mobile=!0;if(r.cros||r.mac||r.linux||r.win)r.desktop=!0;if(r.chrome||r.opr||r.safari)r.webkit=!0;if(r.rv||r.edge){var s="msie";i.browser=s,r[s]=!0}if(r.safari&&r.blackberry){var o="blackberry";i.browser=o,r[o]=!0}if(r.safari&&r.playbook){var u="playbook";i.browser=u,r[u]=!0}if(r.bb){var a="blackberry";i.browser=a,r[a]=!0}if(r.opr){var f="opera";i.browser=f,r[f]=!0}if(r.safari&&r.android){var l="android";i.browser=l,r[l]=!0}if(r.safari&&r.kindle){var c="kindle";i.browser=c,r[c]=!0}if(r.safari&&r.silk){var h="silk";i.browser=h,r[h]=!0}return r.name=i.browser,r.platform=i.platform,r}return window.jQBrowser=t(window.navigator.userAgent),window.jQBrowser.uaMatch=t,e&&(e.browser=window.jQBrowser),window.jQBrowser});var CryptoJS=CryptoJS||function(e,t){var n={},r=n.lib={},i=r.Base=function(){function e(){}return{extend:function(t){e.prototype=this;var n=new e;return t&&n.mixIn(t),n.hasOwnProperty("init")||(n.init=function(){n.$super.init.apply(this,arguments)}),n.init.prototype=n,n.$super=this,n},create:function(){var e=this.extend();return e.init.apply(e,arguments),e},init:function(){},mixIn:function(e){for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);e.hasOwnProperty("toString")&&(this.toString=e.toString)},clone:function(){return this.init.prototype.extend(this)}}}(),s=r.WordArray=i.extend({init:function(e,n){e=this.words=e||[],n!=t?this.sigBytes=n:this.sigBytes=e.length*4},toString:function(e){return(e||u).stringify(this)},concat:function(e){var t=this.words,n=e.words,r=this.sigBytes,i=e.sigBytes;this.clamp();if(r%4)for(var s=0;s<i;s++){var o=n[s>>>2]>>>24-s%4*8&255;t[r+s>>>2]|=o<<24-(r+s)%4*8}else if(n.length>65535)for(var s=0;s<i;s+=4)t[r+s>>>2]=n[s>>>2];else t.push.apply(t,n);return this.sigBytes+=i,this},clamp:function(){var t=this.words,n=this.sigBytes;t[n>>>2]&=4294967295<<32-n%4*8,t.length=e.ceil(n/4)},clone:function(){var e=i.clone.call(this);return e.words=this.words.slice(0),e},random:function(t){var n=[];for(var r=0;r<t;r+=4)n.push(e.random()*4294967296|0);return new s.init(n,t)}}),o=n.enc={},u=o.Hex={stringify:function(e){var t=e.words,n=e.sigBytes,r=[];for(var i=0;i<n;i++){var s=t[i>>>2]>>>24-i%4*8&255;r.push((s>>>4).toString(16)),r.push((s&15).toString(16))}return r.join("")},parse:function(e){var t=e.length,n=[];for(var r=0;r<t;r+=2)n[r>>>3]|=parseInt(e.substr(r,2),16)<<24-r%8*4;return new s.init(n,t/2)}},a=o.Latin1={stringify:function(e){var t=e.words,n=e.sigBytes,r=[];for(var i=0;i<n;i++){var s=t[i>>>2]>>>24-i%4*8&255;r.push(String.fromCharCode(s))}return r.join("")},parse:function(e){var t=e.length,n=[];for(var r=0;r<t;r++)n[r>>>2]|=(e.charCodeAt(r)&255)<<24-r%4*8;return new s.init(n,t)}},f=o.Utf8={stringify:function(e){try{return decodeURIComponent(escape(a.stringify(e)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(e){return a.parse(unescape(encodeURIComponent(e)))}},l=r.BufferedBlockAlgorithm=i.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(e){typeof e=="string"&&(e=f.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(t){var n=this._data,r=n.words,i=n.sigBytes,o=this.blockSize,u=o*4,a=i/u;t?a=e.ceil(a):a=e.max((a|0)-this._minBufferSize,0);var f=a*o,l=e.min(f*4,i);if(f){for(var c=0;c<f;c+=o)this._doProcessBlock(r,c);var h=r.splice(0,f);n.sigBytes-=l}return new s.init(h,l)},clone:function(){var e=i.clone.call(this);return e._data=this._data.clone(),e},_minBufferSize:0}),c=r.Hasher=l.extend({cfg:i.extend(),init:function(e){this.cfg=this.cfg.extend(e),this.reset()},reset:function(){l.reset.call(this),this._doReset()},update:function(e){return this._append(e),this._process(),this},finalize:function(e){e&&this._append(e);var t=this._doFinalize();return t},blockSize:16,_createHelper:function(e){return function(t,n){return(new e.init(n)).finalize(t)}},_createHmacHelper:function(e){return function(t,n){return(new h.HMAC.init(e,n)).finalize(t)}}}),h=n.algo={};return n}(Math);define("crypto.core",function(){}),function(){var e=CryptoJS,t=e.lib,n=t.WordArray,r=e.enc,i=r.Base64={stringify:function(e){var t=e.words,n=e.sigBytes,r=this._map;e.clamp();var i=[];for(var s=0;s<n;s+=3){var o=t[s>>>2]>>>24-s%4*8&255,u=t[s+1>>>2]>>>24-(s+1)%4*8&255,a=t[s+2>>>2]>>>24-(s+2)%4*8&255,f=o<<16|u<<8|a;for(var l=0;l<4&&s+l*.75<n;l++)i.push(r.charAt(f>>>6*(3-l)&63))}var c=r.charAt(64);if(c)while(i.length%4)i.push(c);return i.join("")},parse:function(e){var t=e.length,r=this._map,i=r.charAt(64);if(i){var s=e.indexOf(i);s!=-1&&(t=s)}var o=[],u=0;for(var a=0;a<t;a++)if(a%4){var f=r.indexOf(e.charAt(a-1))<<a%4*2,l=r.indexOf(e.charAt(a))>>>6-a%4*2;o[u>>>2]|=(f|l)<<24-u%4*8,u++}return n.create(o,u)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),define("crypto.enc-base64",["crypto.core"],function(){}),function(e){function a(e,t,n,r,i,s,o){var u=e+(t&n|~t&r)+i+o;return(u<<s|u>>>32-s)+t}function f(e,t,n,r,i,s,o){var u=e+(t&r|n&~r)+i+o;return(u<<s|u>>>32-s)+t}function l(e,t,n,r,i,s,o){var u=e+(t^n^r)+i+o;return(u<<s|u>>>32-s)+t}function c(e,t,n,r,i,s,o){var u=e+(n^(t|~r))+i+o;return(u<<s|u>>>32-s)+t}var t=CryptoJS,n=t.lib,r=n.WordArray,i=n.Hasher,s=t.algo,o=[];(function(){for(var t=0;t<64;t++)o[t]=e.abs(e.sin(t+1))*4294967296|0})();var u=s.MD5=i.extend({_doReset:function(){this._hash=new r.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(e,t){for(var n=0;n<16;n++){var r=t+n,i=e[r];e[r]=(i<<8|i>>>24)&16711935|(i<<24|i>>>8)&4278255360}var s=this._hash.words,u=e[t+0],h=e[t+1],p=e[t+2],d=e[t+3],v=e[t+4],m=e[t+5],g=e[t+6],y=e[t+7],b=e[t+8],w=e[t+9],E=e[t+10],S=e[t+11],x=e[t+12],N=e[t+13],C=e[t+14],k=e[t+15],L=s[0],A=s[1],O=s[2],M=s[3];L=a(L,A,O,M,u,7,o[0]),M=a(M,L,A,O,h,12,o[1]),O=a(O,M,L,A,p,17,o[2]),A=a(A,O,M,L,d,22,o[3]),L=a(L,A,O,M,v,7,o[4]),M=a(M,L,A,O,m,12,o[5]),O=a(O,M,L,A,g,17,o[6]),A=a(A,O,M,L,y,22,o[7]),L=a(L,A,O,M,b,7,o[8]),M=a(M,L,A,O,w,12,o[9]),O=a(O,M,L,A,E,17,o[10]),A=a(A,O,M,L,S,22,o[11]),L=a(L,A,O,M,x,7,o[12]),M=a(M,L,A,O,N,12,o[13]),O=a(O,M,L,A,C,17,o[14]),A=a(A,O,M,L,k,22,o[15]),L=f(L,A,O,M,h,5,o[16]),M=f(M,L,A,O,g,9,o[17]),O=f(O,M,L,A,S,14,o[18]),A=f(A,O,M,L,u,20,o[19]),L=f(L,A,O,M,m,5,o[20]),M=f(M,L,A,O,E,9,o[21]),O=f(O,M,L,A,k,14,o[22]),A=f(A,O,M,L,v,20,o[23]),L=f(L,A,O,M,w,5,o[24]),M=f(M,L,A,O,C,9,o[25]),O=f(O,M,L,A,d,14,o[26]),A=f(A,O,M,L,b,20,o[27]),L=f(L,A,O,M,N,5,o[28]),M=f(M,L,A,O,p,9,o[29]),O=f(O,M,L,A,y,14,o[30]),A=f(A,O,M,L,x,20,o[31]),L=l(L,A,O,M,m,4,o[32]),M=l(M,L,A,O,b,11,o[33]),O=l(O,M,L,A,S,16,o[34]),A=l(A,O,M,L,C,23,o[35]),L=l(L,A,O,M,h,4,o[36]),M=l(M,L,A,O,v,11,o[37]),O=l(O,M,L,A,y,16,o[38]),A=l(A,O,M,L,E,23,o[39]),L=l(L,A,O,M,N,4,o[40]),M=l(M,L,A,O,u,11,o[41]),O=l(O,M,L,A,d,16,o[42]),A=l(A,O,M,L,g,23,o[43]),L=l(L,A,O,M,w,4,o[44]),M=l(M,L,A,O,x,11,o[45]),O=l(O,M,L,A,k,16,o[46]),A=l(A,O,M,L,p,23,o[47]),L=c(L,A,O,M,u,6,o[48]),M=c(M,L,A,O,y,10,o[49]),O=c(O,M,L,A,C,15,o[50]),A=c(A,O,M,L,m,21,o[51]),L=c(L,A,O,M,x,6,o[52]),M=c(M,L,A,O,d,10,o[53]),O=c(O,M,L,A,E,15,o[54]),A=c(A,O,M,L,h,21,o[55]),L=c(L,A,O,M,b,6,o[56]),M=c(M,L,A,O,k,10,o[57]),O=c(O,M,L,A,g,15,o[58]),A=c(A,O,M,L,N,21,o[59]),L=c(L,A,O,M,v,6,o[60]),M=c(M,L,A,O,S,10,o[61]),O=c(O,M,L,A,p,15,o[62]),A=c(A,O,M,L,w,21,o[63]),s[0]=s[0]+L|0,s[1]=s[1]+A|0,s[2]=s[2]+O|0,s[3]=s[3]+M|0},_doFinalize:function(){var t=this._data,n=t.words,r=this._nDataBytes*8,i=t.sigBytes*8;n[i>>>5]|=128<<24-i%32;var s=e.floor(r/4294967296),o=r;n[(i+64>>>9<<4)+15]=(s<<8|s>>>24)&16711935|(s<<24|s>>>8)&4278255360,n[(i+64>>>9<<4)+14]=(o<<8|o>>>24)&16711935|(o<<24|o>>>8)&4278255360,t.sigBytes=(n.length+1)*4,this._process();var u=this._hash,a=u.words;for(var f=0;f<4;f++){var l=a[f];a[f]=(l<<8|l>>>24)&16711935|(l<<24|l>>>8)&4278255360}return u},clone:function(){var e=i.clone.call(this);return e._hash=this._hash.clone(),e}});t.MD5=i._createHelper(u),t.HmacMD5=i._createHmacHelper(u)}(Math),define("crypto.md5",["crypto.core"],function(){}),function(){var e=CryptoJS,t=e.lib,n=t.Base,r=t.WordArray,i=e.algo,s=i.MD5,o=i.EvpKDF=n.extend({cfg:n.extend({keySize:4,hasher:s,iterations:1}),init:function(e){this.cfg=this.cfg.extend(e)},compute:function(e,t){var n=this.cfg,i=n.hasher.create(),s=r.create(),o=s.words,u=n.keySize,a=n.iterations;while(o.length<u){f&&i.update(f);var f=i.update(e).finalize(t);i.reset();for(var l=1;l<a;l++)f=i.finalize(f),i.reset();s.concat(f)}return s.sigBytes=u*4,s}});e.EvpKDF=function(e,t,n){return o.create(n).compute(e,t)}}(),define("crypto.evpkdf",["crypto.md5"],function(){}),CryptoJS.lib.Cipher||function(e){var t=CryptoJS,n=t.lib,r=n.Base,i=n.WordArray,s=n.BufferedBlockAlgorithm,o=t.enc,u=o.Utf8,a=o.Base64,f=t.algo,l=f.EvpKDF,c=n.Cipher=s.extend({cfg:r.extend(),createEncryptor:function(e,t){return this.create(this._ENC_XFORM_MODE,e,t)},createDecryptor:function(e,t){return this.create(this._DEC_XFORM_MODE,e,t)},init:function(e,t,n){this.cfg=this.cfg.extend(n),this._xformMode=e,this._key=t,this.reset()},reset:function(){s.reset.call(this),this._doReset()},process:function(e){return this._append(e),this._process()},finalize:function(e){e&&this._append(e);var t=this._doFinalize();return t},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){function e(e){return typeof e=="string"?N:S}return function(t){return{encrypt:function(n,r,i){return e(r).encrypt(t,n,r,i)},decrypt:function(n,r,i){return e(r).decrypt(t,n,r,i)}}}}()}),h=n.StreamCipher=c.extend({_doFinalize:function(){var e=this._process(!0);return e},blockSize:1}),p=t.mode={},d=n.BlockCipherMode=r.extend({createEncryptor:function(e,t){return this.Encryptor.create(e,t)},createDecryptor:function(e,t){return this.Decryptor.create(e,t)},init:function(e,t){this._cipher=e,this._iv=t}}),v=p.CBC=function(){function n(t,n,r){var i=this._iv;if(i){var s=i;this._iv=e}else var s=this._prevBlock;for(var o=0;o<r;o++)t[n+o]^=s[o]}var t=d.extend();return t.Encryptor=t.extend({processBlock:function(e,t){var r=this._cipher,i=r.blockSize;n.call(this,e,t,i),r.encryptBlock(e,t),this._prevBlock=e.slice(t,t+i)}}),t.Decryptor=t.extend({processBlock:function(e,t){var r=this._cipher,i=r.blockSize,s=e.slice(t,t+i);r.decryptBlock(e,t),n.call(this,e,t,i),this._prevBlock=s}}),t}(),m=t.pad={},g=m.Pkcs7={pad:function(e,t){var n=t*4,r=n-e.sigBytes%n,s=r<<24|r<<16|r<<8|r,o=[];for(var u=0;u<r;u+=4)o.push(s);var a=i.create(o,r);e.concat(a)},unpad:function(e){var t=e.words[e.sigBytes-1>>>2]&255;e.sigBytes-=t}},y=n.BlockCipher=c.extend({cfg:c.cfg.extend({mode:v,padding:g}),reset:function(){c.reset.call(this);var e=this.cfg,t=e.iv,n=e.mode;if(this._xformMode==this._ENC_XFORM_MODE)var r=n.createEncryptor;else{var r=n.createDecryptor;this._minBufferSize=1}this._mode=r.call(n,this,t&&t.words)},_doProcessBlock:function(e,t){this._mode.processBlock(e,t)},_doFinalize:function(){var e=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){e.pad(this._data,this.blockSize);var t=this._process(!0)}else{var t=this._process(!0);e.unpad(t)}return t},blockSize:4}),b=n.CipherParams=r.extend({init:function(e){this.mixIn(e)},toString:function(e){return(e||this.formatter).stringify(this)}}),w=t.format={},E=w.OpenSSL={stringify:function(e){var t=e.ciphertext,n=e.salt;if(n)var r=i.create([1398893684,1701076831]).concat(n).concat(t);else var r=t;return r.toString(a)},parse:function(e){var t=a.parse(e),n=t.words;if(n[0]==1398893684&&n[1]==1701076831){var r=i.create(n.slice(2,4));n.splice(0,4),t.sigBytes-=16}return b.create({ciphertext:t,salt:r})}},S=n.SerializableCipher=r.extend({cfg:r.extend({format:E}),encrypt:function(e,t,n,r){r=this.cfg.extend(r);var i=e.createEncryptor(n,r),s=i.finalize(t),o=i.cfg;return b.create({ciphertext:s,key:n,iv:o.iv,algorithm:e,mode:o.mode,padding:o.padding,blockSize:e.blockSize,formatter:r.format})},decrypt:function(e,t,n,r){r=this.cfg.extend(r),t=this._parse(t,r.format);var i=e.createDecryptor(n,r).finalize(t.ciphertext);return i},_parse:function(e,t){return typeof e=="string"?t.parse(e,this):e}}),x=t.kdf={},T=x.OpenSSL={execute:function(e,t,n,r){r||(r=i.random(8));var s=l.create({keySize:t+n}).compute(e,r),o=i.create(s.words.slice(t),n*4);return s.sigBytes=t*4,b.create({key:s,iv:o,salt:r})}},N=n.PasswordBasedCipher=S.extend({cfg:S.cfg.extend({kdf:T}),encrypt:function(e,t,n,r){r=this.cfg.extend(r);var i=r.kdf.execute(n,e.keySize,e.ivSize);r.iv=i.iv;var s=S.encrypt.call(this,e,t,i.key,r);return s.mixIn(i),s},decrypt:function(e,t,n,r){r=this.cfg.extend(r),t=this._parse(t,r.format);var i=r.kdf.execute(n,e.keySize,e.ivSize,t.salt);r.iv=i.iv;var s=S.decrypt.call(this,e,t,i.key,r);return s}})}(),define("crypto.cipher-core",["crypto.enc-base64","crypto.evpkdf"],function(){}),function(){var e=CryptoJS,t=e.lib,n=t.BlockCipher,r=e.algo,i=[],s=[],o=[],u=[],a=[],f=[],l=[],c=[],h=[],p=[];(function(){var e=[];for(var t=0;t<256;t++)t<128?e[t]=t<<1:e[t]=t<<1^283;var n=0,r=0;for(var t=0;t<256;t++){var d=r^r<<1^r<<2^r<<3^r<<4;d=d>>>8^d&255^99,i[n]=d,s[d]=n;var v=e[n],m=e[v],g=e[m],y=e[d]*257^d*16843008;o[n]=y<<24|y>>>8,u[n]=y<<16|y>>>16,a[n]=y<<8|y>>>24,f[n]=y;var y=g*16843009^m*65537^v*257^n*16843008;l[d]=y<<24|y>>>8,c[d]=y<<16|y>>>16,h[d]=y<<8|y>>>24,p[d]=y,n?(n=v^e[e[e[g^v]]],r^=e[e[r]]):n=r=1}})();var d=[0,1,2,4,8,16,32,64,128,27,54],v=r.AES=n.extend({_doReset:function(){var e=this._key,t=e.words,n=e.sigBytes/4,r=this._nRounds=n+6,s=(r+1)*4,o=this._keySchedule=[];for(var u=0;u<s;u++)if(u<n)o[u]=t[u];else{var a=o[u-1];u%n?n>6&&u%n==4&&(a=i[a>>>24]<<24|i[a>>>16&255]<<16|i[a>>>8&255]<<8|i[a&255]):(a=a<<8|a>>>24,a=i[a>>>24]<<24|i[a>>>16&255]<<16|i[a>>>8&255]<<8|i[a&255],a^=d[u/n|0]<<24),o[u]=o[u-n]^a}var f=this._invKeySchedule=[];for(var v=0;v<s;v++){var u=s-v;if(v%4)var a=o[u];else var a=o[u-4];v<4||u<=4?f[v]=a:f[v]=l[i[a>>>24]]^c[i[a>>>16&255]]^h[i[a>>>8&255]]^p[i[a&255]]}},encryptBlock:function(e,t){this._doCryptBlock(e,t,this._keySchedule,o,u,a,f,i)},decryptBlock:function(e,t){var n=e[t+1];e[t+1]=e[t+3],e[t+3]=n,this._doCryptBlock(e,t,this._invKeySchedule,l,c,h,p,s);var n=e[t+1];e[t+1]=e[t+3],e[t+3]=n},_doCryptBlock:function(e,t,n,r,i,s,o,u){var a=this._nRounds,f=e[t]^n[0],l=e[t+1]^n[1],c=e[t+2]^n[2],h=e[t+3]^n[3],p=4;for(var d=1;d<a;d++){var v=r[f>>>24]^i[l>>>16&255]^s[c>>>8&255]^o[h&255]^n[p++],m=r[l>>>24]^i[c>>>16&255]^s[h>>>8&255]^o[f&255]^n[p++],g=r[c>>>24]^i[h>>>16&255]^s[f>>>8&255]^o[l&255]^n[p++],y=r[h>>>24]^i[f>>>16&255]^s[l>>>8&255]^o[c&255]^n[p++];f=v,l=m,c=g,h=y}var v=(u[f>>>24]<<24|u[l>>>16&255]<<16|u[c>>>8&255]<<8|u[h&255])^n[p++],m=(u[l>>>24]<<24|u[c>>>16&255]<<16|u[h>>>8&255]<<8|u[f&255])^n[p++],g=(u[c>>>24]<<24|u[h>>>16&255]<<16|u[f>>>8&255]<<8|u[l&255])^n[p++],y=(u[h>>>24]<<24|u[f>>>16&255]<<16|u[l>>>8&255]<<8|u[c&255])^n[p++];e[t]=v,e[t+1]=m,e[t+2]=g,e[t+3]=y},keySize:8});e.AES=n._createHelper(v)}(),define("crypto.aes",["crypto.cipher-core"],function(){}),function(){var e=CryptoJS,t=e.lib,n=t.WordArray,r=t.Hasher,i=e.algo,s=[],o=i.SHA1=r.extend({_doReset:function(){this._hash=new n.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(e,t){var n=this._hash.words,r=n[0],i=n[1],o=n[2],u=n[3],a=n[4];for(var f=0;f<80;f++){if(f<16)s[f]=e[t+f]|0;else{var l=s[f-3]^s[f-8]^s[f-14]^s[f-16];s[f]=l<<1|l>>>31}var c=(r<<5|r>>>27)+a+s[f];f<20?c+=(i&o|~i&u)+1518500249:f<40?c+=(i^o^u)+1859775393:f<60?c+=(i&o|i&u|o&u)-1894007588:c+=(i^o^u)-899497514,a=u,u=o,o=i<<30|i>>>2,i=r,r=c}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+o|0,n[3]=n[3]+u|0,n[4]=n[4]+a|0},_doFinalize:function(){var e=this._data,t=e.words,n=this._nDataBytes*8,r=e.sigBytes*8;return t[r>>>5]|=128<<24-r%32,t[(r+64>>>9<<4)+14]=Math.floor(n/4294967296),t[(r+64>>>9<<4)+15]=n,e.sigBytes=t.length*4,this._process(),this._hash},clone:function(){var e=r.clone.call(this);return e._hash=this._hash.clone(),e}});e.SHA1=r._createHelper(o),e.HmacSHA1=r._createHmacHelper(o)}(),define("crypto.sha1",["crypto.core"],function(){}),function(e){var t=CryptoJS,n=t.lib,r=n.WordArray,i=n.Hasher,s=t.algo,o=[],u=[];(function(){function t(t){var n=e.sqrt(t);for(var r=2;r<=n;r++)if(!(t%r))return!1;return!0}function n(e){return(e-(e|0))*4294967296|0}var r=2,i=0;while(i<64)t(r)&&(i<8&&(o[i]=n(e.pow(r,.5))),u[i]=n(e.pow(r,1/3)),i++),r++})();var a=[],f=s.SHA256=i.extend({_doReset:function(){this._hash=new r.init(o.slice(0))},_doProcessBlock:function(e,t){var n=this._hash.words,r=n[0],i=n[1],s=n[2],o=n[3],f=n[4],l=n[5],c=n[6],h=n[7];for(var p=0;p<64;p++){if(p<16)a[p]=e[t+p]|0;else{var d=a[p-15],v=(d<<25|d>>>7)^(d<<14|d>>>18)^d>>>3,m=a[p-2],g=(m<<15|m>>>17)^(m<<13|m>>>19)^m>>>10;a[p]=v+a[p-7]+g+a[p-16]}var y=f&l^~f&c,b=r&i^r&s^i&s,w=(r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22),E=(f<<26|f>>>6)^(f<<21|f>>>11)^(f<<7|f>>>25),S=h+E+y+u[p]+a[p],x=w+b;h=c,c=l,l=f,f=o+S|0,o=s,s=i,i=r,r=S+x|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+s|0,n[3]=n[3]+o|0,n[4]=n[4]+f|0,n[5]=n[5]+l|0,n[6]=n[6]+c|0,n[7]=n[7]+h|0},_doFinalize:function(){var t=this._data,n=t.words,r=this._nDataBytes*8,i=t.sigBytes*8;return n[i>>>5]|=128<<24-i%32,n[(i+64>>>9<<4)+14]=e.floor(r/4294967296),n[(i+64>>>9<<4)+15]=r,t.sigBytes=n.length*4,this._process(),this._hash},clone:function(){var e=i.clone.call(this);return e._hash=this._hash.clone(),e}});t.SHA256=i._createHelper(f),t.HmacSHA256=i._createHmacHelper(f)}(Math),define("crypto.sha256",["crypto.core"],function(){}),function(){var e=CryptoJS,t=e.lib,n=t.Base,r=e.enc,i=r.Utf8,s=e.algo,o=s.HMAC=n.extend({init:function(e,t){e=this._hasher=new e.init,typeof t=="string"&&(t=i.parse(t));var n=e.blockSize,r=n*4;t.sigBytes>r&&(t=e.finalize(t)),t.clamp();var s=this._oKey=t.clone(),o=this._iKey=t.clone(),u=s.words,a=o.words;for(var f=0;f<n;f++)u[f]^=1549556828,a[f]^=909522486;s.sigBytes=o.sigBytes=r,this.reset()},reset:function(){var e=this._hasher;e.reset(),e.update(this._iKey)},update:function(e){return this._hasher.update(e),this},finalize:function(e){var t=this._hasher,n=t.finalize(e);t.reset();var r=t.finalize(this._oKey.clone().concat(n));return r}})}(),define("crypto.hmac",["crypto.core"],function(){}),CryptoJS.pad.NoPadding={pad:function(){},unpad:function(){}},define("crypto.pad-nopadding",["crypto.cipher-core"],function(){}),CryptoJS.mode.CTR=function(){var e=CryptoJS.lib.BlockCipherMode.extend(),t=e.Encryptor=e.extend({processBlock:function(e,t){var n=this._cipher,r=n.blockSize,i=this._iv,s=this._counter;i&&(s=this._counter=i.slice(0),this._iv=undefined);var o=s.slice(0);n.encryptBlock(o,0),s[r-1]=s[r-1]+1|0;for(var u=0;u<r;u++)e[t+u]^=o[u]}});return e.Decryptor=t,e}(),define("crypto.mode-ctr",["crypto.cipher-core"],function(){}),function(e,t){typeof define=="function"&&define.amd?define("crypto",["crypto.core","crypto.enc-base64","crypto.md5","crypto.evpkdf","crypto.cipher-core","crypto.aes","crypto.sha1","crypto.sha256","crypto.hmac","crypto.pad-nopadding","crypto.mode-ctr"],function(){return CryptoJS}):e.CryptoJS=t()}(this),function(e,t){typeof define=="function"&&define.amd?define("bigint",[],t.bind(e,e.crypto||e.msCrypto)):typeof module!="undefined"&&module.exports?module.exports=t(require("crypto")):e.BigInt=t(e.crypto||e.msCrypto)}(this,function(e){function G(e){var t,n,r,i;n=new Array(e);for(t=0;t<e;t++)n[t]=0;n[0]=2,r=0;for(;n[r]<e;){for(t=n[r]*n[r];t<e;t+=n[r])n[t]=1;r++,n[r]=n[r-1]+1;for(;n[r]<e&&n[n[r]];n[r]++);}i=new Array(r);for(t=0;t<r;t++)i[t]=n[t];return i}function Y(e,t){return y.length!=e.length&&(y=Pt(e),b=Pt(e),w=Pt(e)),Bt(w,t),Z(e,w)}function Z(e,n){var r,i,s,o;y.length!=e.length&&(y=Pt(e),b=Pt(e),w=Pt(e)),Ht(w,n),Ht(b,e),Ht(y,e),jt(b,-1),jt(y,-1);if(_t(b))return 0;for(s=0;b[s]==0;s++);for(r=1,i=2;b[s]%i==0;i*=2,r++);o=s*t+r-1,o&&Ft(b,o),en(w,b,e);if(!Ot(w,1)&&!Mt(w,y)){i=1;while(i<=o-1&&!Mt(w,y)){Yt(w,e);if(Ot(w,1))return 0;i++}if(!Mt(w,y))return 0}return 1}function et(e){var n,r,i;for(n=e.length-1;e[n]==0&&n>0;n--);for(r=0,i=e[n];i;i>>=1,r++);return r+=t*n,r}function tt(e,n){var r=Lt(0,(e.length>n?e.length:n)*t,0);return Ht(r,e),r}function nt(e){var t=Lt(0,e,0);return pt(t,e),Zt(t,1)}function rt(e){return e>=600?it(e,2):e>=550?it(e,4):e>=500?it(e,5):e>=400?it(e,6):e>=350?it(e,7):e>=300?it(e,9):e>=250?it(e,12):e>=200?it(e,15):e>=150?it(e,18):e>=100?it(e,27):it(e,40)}function it(e,t){var n,r,i,s;s=3e4,n=Lt(0,e,0),P.length==0&&(P=G(3e4)),Q.length!=n.length&&(Q=Pt(n));for(;;){vt(n,e,0),n[0]|=1,i=0;for(r=0;r<P.length&&P[r]<=s;r++)if(kt(n,P[r])==0&&!Ot(n,P[r])){i=1;break}for(r=0;r<t&&!i;r++){vt(Q,e,0);while(!Tt(n,Q))vt(Q,e,0);Z(n,Q)||(i=1)}if(!i)return n}}function st(e,t){var n=Pt(e);return Qt(n,t),Zt(n,1)}function ot(e,t){var n=tt(e,e.length+1);return jt(n,t),Zt(n,1)}function ut(e,t){var n=tt(e,e.length+t.length);return Kt(n,t),Zt(n,1)}function at(e,t,n){var r=tt(e,n.length);return en(r,Zt(t,2),Zt(n,2),0),Zt(r,1)}function ft(e,t){var n=tt(e,e.length>t.length?e.length+1:t.length+1);return $t(n,t),Zt(n,1)}function lt(e,t){var n=tt(e,e.length>t.length?e.length+1:t.length+1);return Jt(n,t),Zt(n,1)}function ct(e,t){var n=tt(e,t.length),r;return r=yt(n,t),r?Zt(n,1):null}function ht(e,t,n){var r=tt(e,n.length);return Gt(r,t,n),Zt(r,1)}function pt(e,n){var r,i,s,o,u,a,f,l,c,h,p,d,v;P.length==0&&(P=G(3e4));if(H.length==0){H=new Array(512);for(a=0;a<512;a++)H[a]=Math.pow(2,a/511-1)}r=.1,s=20,v=20,j.length!=e.length&&(j=Pt(e),F=Pt(e),R=Pt(e),z=Pt(e),V=Pt(e),$=Pt(e),J=Pt(e),X=Pt(e),W=Pt(e),B=Pt(e),I=Pt(e),q=Pt(e),U=Pt(e),K=Pt(e));if(n<=v){o=(1<<(n+2>>1))-1,Bt(e,0);for(u=1;u;){u=0,e[0]=1|1<<n-1|hn(n);for(a=1;a<P.length&&(P[a]&o)==P[a];a++)if(0==e[0]%P[a]){u=1;break}}Ct(e);return}l=r*n*n;if(n>2*s)for(f=1;n-n*f<=s;)f=H[hn(9)];else f=.5;d=Math.floor(f*n)+1,pt(q,d),Bt(j,0),j[Math.floor((n-2)/t)]|=1<<(n-2)%t,Nt(j,q,B,I),h=et(B);for(;;){for(;;){vt(F,h,0);if(Tt(B,F))break}jt(F,1),Jt(F,B),Ht(W,q),Kt(W,F),Rt(W,2),jt(W,1),Ht(z,F),Rt(z,2);for(c=0,a=0;a<P.length&&P[a]<l;a++)if(kt(W,P[a])==0&&!Ot(W,P[a])){c=1;break}c||Y(W,2)||(c=1);if(!c){jt(W,-3);for(a=W.length-1;W[a]==0&&a>0;a--);for(p=0,i=W[a];i;i>>=1,p++);p+=t*a;for(;;){vt(U,p,0);if(Tt(W,U))break}jt(W,3),jt(U,2),Ht(X,U),Ht(R,W),jt(R,-1),en(X,R,W),jt(X,-1);if(_t(X)){Ht(X,U),en(X,z,W),jt(X,-1),Ht(K,W),Ht(V,X),gt(V,W);if(Ot(V,1)){Ht(e,K);return}}}}}function dt(e,n){var r,i;return r=Math.floor((e-1)/t)+2,i=Lt(0,0,r),vt(i,e,n),i}function vt(e,n,r){var i,s;for(i=0;i<e.length;i++)e[i]=0;s=Math.floor((n-1)/t)+1;for(i=0;i<s;i++)e[i]=hn(t);e[s-1]&=(2<<(n-1)%t)-1,r==1&&(e[s-1]|=1<<(n-1)%t)}function mt(e,t){var n,r;return n=Pt(e),r=Pt(t),gt(n,r),n}function gt(e,t){var n,r,i,s,u,a,f,l,c,h;m.length!=e.length&&(m=Pt(e)),c=1;while(c){c=0;for(n=1;n<t.length;n++)if(t[n]){c=1;break}if(!c)break;for(n=e.length;!e[n]&&n>=0;n--);r=e[n],i=t[n],s=1,u=0,a=0,f=1;while(i+a&&i+f){l=Math.floor((r+s)/(i+a)),h=Math.floor((r+u)/(i+f));if(l!=h)break;o=s-l*a,s=a,a=o,o=u-l*f,u=f,f=o,o=r-l*i,r=i,i=o}u?(Ht(m,e),zt(e,t,s,u),zt(t,m,f,a)):(Qt(e,t),Ht(m,e),Ht(e,t),Ht(t,m))}if(t[0]==0)return;o=kt(e,t[0]),Bt(e,t[0]),t[0]=o;while(t[0])e[0]%=t[0],o=e[0],e[0]=t[0],t[0]=o}function yt(e,t){var n=1+2*Math.max(e.length,t.length);if(!(e[0]&1)&&!(t[0]&1))return Bt(e,0),0;S.length!=n&&(S=new Array(n),E=new Array(n),x=new Array(n),T=new Array(n),N=new Array(n),C=new Array(n)),Ht(S,e),Ht(E,t),Bt(x,1),Bt(T,0),Bt(N,0),Bt(C,1);for(;;){while(!(S[0]&1))It(S),!(x[0]&1)&&!(T[0]&1)?(It(x),It(T)):(Jt(x,t),It(x),$t(T,e),It(T));while(!(E[0]&1))It(E),!(N[0]&1)&&!(C[0]&1)?(It(N),It(C)):(Jt(N,t),It(N),$t(C,e),It(C));Tt(E,S)?($t(E,S),$t(N,x),$t(C,T)):($t(S,E),$t(x,N),$t(T,C));if(Ot(S,0)){while(St(N))Jt(N,t);return Ht(e,N),Ot(E,1)?1:(Bt(e,0),0)}}}function bt(e,t){var n=1,r=0,i;for(;;){if(e==1)return n;if(e==0)return 0;r-=n*Math.floor(t/e),t%=e;if(t==1)return r;if(t==0)return 0;n-=r*Math.floor(e/t),e%=t}}function wt(e,t){return bt(e,t)}function Et(e,t,n,r,i){var s=0,o=Math.max(e.length,t.length);S.length!=o&&(S=new Array(o),x=new Array(o),T=new Array(o),N=new Array(o),C=new Array(o));while(!(e[0]&1)&&!(t[0]&1))It(e),It(t),s++;Ht(S,e),Ht(n,t),Bt(x,1),Bt(T,0),Bt(N,0),Bt(C,1);for(;;){while(!(S[0]&1))It(S),!(x[0]&1)&&!(T[0]&1)?(It(x),It(T)):(Jt(x,t),It(x),$t(T,e),It(T));while(!(n[0]&1))It(n),!(N[0]&1)&&!(C[0]&1)?(It(N),It(C)):(Jt(N,t),It(N),$t(C,e),It(C));Tt(n,S)?($t(n,S),$t(N,x),$t(C,T)):($t(S,n),$t(x,N),$t(T,C));if(Ot(S,0)){while(St(N))Jt(N,t),$t(C,e);Rt(C,-1),Ht(r,N),Ht(i,C),qt(n,s);return}}}function St(e){return e[e.length-1]>>t-1&1}function xt(e,t,n){var r,i=e.length,s=t.length,o=i+n<s?i+n:s;for(r=s-1-n;r<i&&r>=0;r++)if(e[r]>0)return 1;for(r=i-1+n;r<s;r++)if(t[r]>0)return 0;for(r=o-1;r>=n;r--){if(e[r-n]>t[r])return 1;if(e[r-n]<t[r])return 0}return 0}function Tt(e,t){var n,r=e.length<t.length?e.length:t.length;for(n=e.length;n<t.length;n++)if(t[n])return 0;for(n=t.length;n<e.length;n++)if(e[n])return 1;for(n=r-1;n>=0;n--){if(e[n]>t[n])return 1;if(e[n]<t[n])return 0}return 0}function Nt(e,i,s,o){var u,a,f,l,c,h,p,d,v;Ht(o,e);for(a=i.length;i[a-1]==0;a--);v=i[a-1];for(d=0;v;d++)v>>=1;d=t-d,qt(i,d),qt(o,d);for(u=o.length;o[u-1]==0&&u>a;u--);Bt(s,0);while(!xt(i,o,u-a))Vt(o,i,u-a),s[u-a]++;for(f=u-1;f>=a;f--){o[f]==i[a-1]?s[f-a]=r:s[f-a]=Math.floor((o[f]*n+o[f-1])/i[a-1]);for(;;){h=(a>1?i[a-2]:0)*s[f-a],p=h,h&=r,p=(p-h)/n,c=p+s[f-a]*i[a-1],p=c,c&=r,p=(p-c)/n;if(!(p==o[f]?c==o[f-1]?h>(f>1?o[f-2]:0):c>o[f-1]:p>o[f]))break;s[f-a]--}Wt(o,i,-s[f-a],f-a),St(o)&&(Xt(o,i,f-a),s[f-a]--)}Ft(i,d),Ft(o,d)}function Ct(e){var t,i,s,o;i=e.length,s=0;for(t=0;t<i;t++)s+=e[t],o=0,s<0&&(o=s&r,o=-((s-o)/n),s+=o*n),e[t]=s&r,s=(s-e[t])/n-o}function kt(e,t){var r,i=0;for(r=e.length-1;r>=0;r--)i=(i*n+e[r])%t;return i}function Lt(e,n,r){var i,s,o;return s=Math.ceil(n/t)+1,s=r>s?r:s,o=new Array(s),Bt(o,e),o}function At(e,t,n){var r,s,o,u,a,f,l=e.length;if(t==-1){u=new Array(0);for(;;){a=new Array(u.length+1);for(s=0;s<u.length;s++)a[s+1]=u[s];a[0]=parseInt(e,10),u=a,r=e.indexOf(",",0);if(r<1)break;e=e.substring(r+1);if(e.length==0)break}return u.length<n?(a=new Array(n),Ht(a,u),a):u}var c=t,h=0,p=t==1?l:0;while(c>1)c&1&&(h=1),p+=l,c>>=1;p+=h*l,u=Lt(0,p,0);for(s=0;s<l;s++){r=i.indexOf(e.substring(s,s+1),0),t<=36&&r>=36&&(r-=26);if(r>=t||r<0)break;Rt(u,t),jt(u,r)}for(l=u.length;l>0&&!u[l-1];l--);l=n>l+1?n:l+1,a=new Array(l),f=l<u.length?l:u.length;for(s=0;s<f;s++)a[s]=u[s];for(;s<l;s++)a[s]=0;return a}function Ot(e,t){var n;if(e[0]!=t)return 0;for(n=1;n<e.length;n++)if(e[n])return 0;return 1}function Mt(e,t){var n,r=e.length<t.length?e.length:t.length;for(n=0;n<r;n++)if(e[n]!=t[n])return 0;if(e.length>t.length){for(;n<e.length;n++)if(e[n])return 0}else for(;n<t.length;n++)if(t[n])return 0;return 1}function _t(e){var t;for(t=0;t<e.length;t++)if(e[t])return 0;return 1}function Dt(e,t){var n,r,s="";d.length!=e.length?d=Pt(e):Ht(d,e);if(t==-1){for(n=e.length-1;n>0;n--)s+=e[n]+",";s+=e[0]}else while(!_t(d))r=Ut(d,t),s=i.substring(r,r+1)+s;return s.length==0&&(s="0"),s}function Pt(e){var t,n;return n=new Array(e.length),Ht(n,e),n}function Ht(e,t){var n,r=e.length<t.length?e.length:t.length;for(n=0;n<r;n++)e[n]=t[n];for(n=r;n<e.length;n++)e[n]=0}function Bt(e,n){var i,s;for(s=n,i=0;i<e.length;i++)e[i]=s&r,s>>=t}function jt(e,t){var i,s,o,u;e[0]+=t,s=e.length,o=0;for(i=0;i<s;i++){o+=e[i],u=0,o<0&&(u=o&r,u=-((o-u)/n),o+=u*n),e[i]=o&r,o=(o-e[i])/n-u;if(!o)return}}function Ft(e,n){var i,s=Math.floor(n/t);if(s){for(i=0;i<e.length-s;i++)e[i]=e[i+s];for(;i<e.length;i++)e[i]=0;n%=t}for(i=0;i<e.length-1;i++)e[i]=r&(e[i+1]<<t-n|e[i]>>n);e[i]>>=n}function It(e){var i;for(i=0;i<e.length-1;i++)e[i]=r&(e[i+1]<<t-1|e[i]>>1);e[i]=e[i]>>1|e[i]&n>>1}function qt(e,n){var i,s=Math.floor(n/t);if(s){for(i=e.length;i>=s;i--)e[i]=e[i-s];for(;i>=0;i--)e[i]=0;n%=t}if(!n)return;for(i=e.length-1;i>0;i--)e[i]=r&(e[i]<<n|e[i-1]>>t-n);e[i]=r&e[i]<<n}function Rt(e,t){var i,s,o,u;if(!t)return;s=e.length,o=0;for(i=0;i<s;i++)o+=e[i]*t,u=0,o<0&&(u=o&r,u=-((o-u)/n),o+=u*n),e[i]=o&r,o=(o-e[i])/n-u}function Ut(e,t){var r,i=0,s;for(r=e.length-1;r>=0;r--)s=i*n+e[r],e[r]=Math.floor(s/t),i=s%t;return i}function zt(e,t,i,s){var o,u,a,f;a=e.length<t.length?e.length:t.length,f=e.length;for(u=0,o=0;o<a;o++)u+=i*e[o]+s*t[o],e[o]=u&r,u=(u-e[o])/n;for(o=a;o<f;o++)u+=i*e[o],e[o]=u&r,u=(u-e[o])/n}function Wt(e,t,i,s){var o,u,a,f;a=e.length<s+t.length?e.length:s+t.length,f=e.length;for(u=0,o=s;o<a;o++)u+=e[o]+i*t[o-s],e[o]=u&r,u=(u-e[o])/n;for(o=a;u&&o<f;o++)u+=e[o],e[o]=u&r,u=(u-e[o])/n}function Xt(e,t,i){var s,o,u,a;u=e.length<i+t.length?e.length:i+t.length,a=e.length;for(o=0,s=i;s<u;s++)o+=e[s]+t[s-i],e[s]=o&r,o=(o-e[s])/n;for(s=u;o&&s<a;s++)o+=e[s],e[s]=o&r,o=(o-e[s])/n}function Vt(e,t,i){var s,o,u,a;u=e.length<i+t.length?e.length:i+t.length,a=e.length;for(o=0,s=i;s<u;s++)o+=e[s]-t[s-i],e[s]=o&r,o=(o-e[s])/n;for(s=u;o&&s<a;s++)o+=e[s],e[s]=o&r,o=(o-e[s])/n}function $t(e,t){var i,s,o,u;o=e.length<t.length?e.length:t.length;for(s=0,i=0;i<o;i++)s+=e[i]-t[i],e[i]=s&r,s=(s-e[i])/n;for(i=o;s&&i<e.length;i++)s+=e[i],e[i]=s&r,s=(s-e[i])/n}function Jt(e,t){var i,s,o,u;o=e.length<t.length?e.length:t.length;for(s=0,i=0;i<o;i++)s+=e[i]+t[i],e[i]=s&r,s=(s-e[i])/n;for(i=o;s&&i<e.length;i++)s+=e[i],e[i]=s&r,s=(s-e[i])/n}function Kt(e,t){var n;u.length!=2*e.length&&(u=new Array(2*e.length)),Bt(u,0);for(n=0;n<t.length;n++)t[n]&&Wt(u,e,t[n],n);Ht(e,u)}function Qt(e,t){h.length!=e.length?h=Pt(e):Ht(h,e),p.length!=e.length&&(p=Pt(e)),Nt(h,t,p,e)}function Gt(e,t,n){var r;a.length!=2*e.length&&(a=new Array(2*e.length)),Bt(a,0);for(r=0;r<t.length;r++)t[r]&&Wt(a,e,t[r],r);Qt(a,n),Ht(e,a)}function Yt(e,t){var i,s,o,u,f,l,c;for(f=e.length;f>0&&!e[f-1];f--);c=f>t.length?2*f:2*t.length,a.length!=c&&(a=new Array(c)),Bt(a,0);for(i=0;i<f;i++){u=a[2*i]+e[i]*e[i],a[2*i]=u&r,u=(u-a[2*i])/n;for(s=i+1;s<f;s++)u=a[i+s]+2*e[i]*e[s]+u,a[i+s]=u&r,u=(u-a[i+s])/n;a[i+f]=u}Qt(a,t),Ht(e,a)}function Zt(e,t){var n,r;for(n=e.length;n>0&&!e[n-1];n--);return r=new Array(n+t),Ht(r,e),r}function en(e,r,i){var o,u,a,f;v.length!=i.length&&(v=Pt(i));if((i[0]&1)==0){Ht(v,e),Bt(e,1);while(!Ot(r,0))r[0]&1&&Gt(e,v,i),Ut(r,2),Yt(v,i);return}Bt(v,0);for(a=i.length;a>0&&!i[a-1];a--);f=n-bt(kt(i,n),n),v[a]=1,Gt(e,v,i),c.length!=e.length?c=Pt(e):Ht(c,e);for(o=r.length-1;o>0&!r[o];o--);if(r[o]==0){Bt(e,1);return}for(u=1<<t-1;u&&!(r[o]&u);u>>=1);for(;;){if(!(u>>=1)){o--;if(o<0){tn(e,s,i,f);return}u=1<<t-1}tn(e,e,i,f),u&r[o]&&tn(e,c,i,f)}}function tn(e,t,i,s){var o,u,a,f,l,c,h,p=i.length,d=t.length;g.length!=p&&(g=new Array(p)),Bt(g,0);for(;p>0&&i[p-1]==0;p--);for(;d>0&&t[d-1]==0;d--);h=g.length-1;for(o=0;o<p;o++){l=g[0]+e[o]*t[0],f=(l&r)*s&r,a=l+f*i[0],a=(a-(a&r))/n,l=e[o],u=1;for(;u<d-4;)a+=g[u]+f*i[u]+l*t[u],c=g[u-1]=a&r,a=(a-c)/n,u++,a+=g[u]+f*i[u]+l*t[u],c=g[u-1]=a&r,a=(a-c)/n,u++,a+=g[u]+f*i[u]+l*t[u],c=g[u-1]=a&r,a=(a-c)/n,u++,a+=g[u]+f*i[u]+l*t[u],c=g[u-1]=a&r,a=(a-c)/n,u++,a+=g[u]+f*i[u]+l*t[u],c=g[u-1]=a&r,a=(a-c)/n,u++;for(;u<d;)a+=g[u]+f*i[u]+l*t[u],c=g[u-1]=a&r,a=(a-c)/n,u++;for(;u<p-4;)a+=g[u]+f*i[u],c=g[u-1]=a&r,a=(a-c)/n,u++,a+=g[u]+f*i[u],c=g[u-1]=a&r,a=(a-c)/n,u++,a+=g[u]+f*i[u],c=g[u-1]=a&r,a=(a-c)/n,u++,a+=g[u]+f*i[u],c=g[u-1]=a&r,a=(a-c)/n,u++,a+=g[u]+f*i[u],c=g[u-1]=a&r,a=(a-c)/n,u++;for(;u<p;)a+=g[u]+f*i[u],c=g[u-1]=a&r,a=(a-c)/n,u++;for(;u<h;)a+=g[u],c=g[u-1]=a&r,a=(a-c)/n,u++;g[u-1]=a&r}Tt(i,g)||$t(g,i),Ht(e,g)}function nn(e,t,n){return ht(e,ct(t,n),n)}function rn(e,t,n){return e=st(e,n),t=st(t,n),Tt(t,e)&&(e=lt(e,n)),ft(e,t)}function sn(e){var n=Math.floor(e/t)+2,r=new Array(n);for(var i=0;i<n;i++)r[i]=0;return r[n-2]=1<<e%t,r}function un(e,t){t||(t=0),e=Pt(e);var n="";while(!_t(e))n=on[e[0]&255]+n,Ft(e,8);while(n.length<t)n="\0"+n;return n}function an(e){var t=At("0",10,e.length);return e.forEach(function(e,n){n&&qt(t,8),t[0]|=e}),t}function ln(){return fn(40)}function cn(){return fn(1)[0]}function hn(e){if(e>31)throw new Error("Too many bits.");var t=0,n=0,r=Math.floor(e/8),i=(1<<e%8)-1;i&&(n=cn()&i);for(;t<r;t++)n=256*n+cn();return n}var t=26,n=1<<t,r=n-1,i="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\'\"+-",s=Lt(1,1,1),o=new Array(0),u=o,a=o,f=o,l=o,c=o,h=o,p=o,d=o,v=o,m=o,g=o,y=o,b=o,w=o,E=o,S=o,x=o,T=o,N=o,C=o,k=o,L=o,A=o,O=o,M=o,_=o,D=o,P=o,H=o,B=o,j=o,F=o,I=o,q=o,R=o,U=o,z=o,W=o,X=o,V=o,$=o,J=o,K=o,Q=o,on=function(){var e=0,t={};for(;e<256;++e)t[e]=String.fromCharCode(e);return t}(),fn=function(){if(typeof e!="undefined"&&typeof e.randomBytes=="function")return function(t){try{var n=e.randomBytes(t)}catch(r){throw r}return Array.prototype.slice.call(n,0)};if(typeof e!="undefined"&&typeof e.getRandomValues=="function")return function(t){var n=new Uint8Array(t);return e.getRandomValues(n),Array.prototype.slice.call(n,0)};console.log("Keys should not be generated without CSPRNG.");return}();return{str2bigInt:At,bigInt2str:Dt,int2bigInt:Lt,multMod:ht,powMod:at,inverseMod:ct,randBigInt:dt,randBigInt_:vt,equals:Mt,equalsInt:Ot,sub:ft,mod:st,modInt:kt,mult:ut,divInt_:Ut,rightShift_:Ft,dup:Pt,greater:Tt,add:lt,isZero:_t,bitSize:et,millerRabin:Z,divide_:Nt,trim:Zt,primes:P,findPrimes:G,getSeed:ln,divMod:nn,subMod:rn,twoToThe:sn,bigInt2bits:un,ba2bigInt:an}}),function(){"use strict";function e(){}function n(e,t){var n=e.length;while(n--)if(e[n].listener===t)return n;return-1}function r(e){return function(){return this[e].apply(this,arguments)}}var t=e.prototype;t.getListeners=function(t){var n=this._getEvents(),r,i;if(typeof t=="object"){r={};for(i in n)n.hasOwnProperty(i)&&t.test(i)&&(r[i]=n[i])}else r=n[t]||(n[t]=[]);return r},t.flattenListeners=function(t){var n=[],r;for(r=0;r<t.length;r+=1)n.push(t[r].listener);return n},t.getListenersAsObject=function(t){var n=this.getListeners(t),r;return n instanceof Array&&(r={},r[t]=n),r||n},t.addListener=function(t,r){var i=this.getListenersAsObject(t),s=typeof r=="object",o;for(o in i)i.hasOwnProperty(o)&&n(i[o],r)===-1&&i[o].push(s?r:{listener:r,once:!1});return this},t.on=r("addListener"),t.addOnceListener=function(t,n){return this.addListener(t,{listener:n,once:!0})},t.once=r("addOnceListener"),t.defineEvent=function(t){return this.getListeners(t),this},t.defineEvents=function(t){for(var n=0;n<t.length;n+=1)this.defineEvent(t[n]);return this},t.removeListener=function(t,r){var i=this.getListenersAsObject(t),s,o;for(o in i)i.hasOwnProperty(o)&&(s=n(i[o],r),s!==-1&&i[o].splice(s,1));return this},t.off=r("removeListener"),t.addListeners=function(t,n){return this.manipulateListeners(!1,t,n)},t.removeListeners=function(t,n){return this.manipulateListeners(!0,t,n)},t.manipulateListeners=function(t,n,r){var i,s,o=t?this.removeListener:this.addListener,u=t?this.removeListeners:this.addListeners;if(typeof n!="object"||n instanceof RegExp){i=r.length;while(i--)o.call(this,n,r[i])}else for(i in n)n.hasOwnProperty(i)&&(s=n[i])&&(typeof s=="function"?o.call(this,i,s):u.call(this,i,s));return this},t.removeEvent=function(t){var n=typeof t,r=this._getEvents(),i;if(n==="string")delete r[t];else if(n==="object")for(i in r)r.hasOwnProperty(i)&&t.test(i)&&delete r[i];else delete this._events;return this},t.emitEvent=function(t,n){var r=this.getListenersAsObject(t),i,s,o,u;for(o in r)if(r.hasOwnProperty(o)){s=r[o].length;while(s--)i=r[o][s],i.once===!0&&this.removeListener(t,i.listener),u=i.listener.apply(this,n||[]),u===this._getOnceReturnValue()&&this.removeListener(t,i.listener)}return this},t.trigger=r("emitEvent"),t.emit=function(t){var n=Array.prototype.slice.call(arguments,1);return this.emitEvent(t,n)},t.setOnceReturnValue=function(t){return this._onceReturnValue=t,this},t._getOnceReturnValue=function(){return this.hasOwnProperty("_onceReturnValue")?this._onceReturnValue:!0},t._getEvents=function(){return this._events||(this._events={})},typeof define=="function"&&define.amd?define("eventemitter",[],function(){return e}):typeof module=="object"&&module.exports?module.exports=e:this.EventEmitter=e}.call(this),function(e,t){typeof define=="function"&&define.amd?define("otr",["jquery","jquery.browser","bigint","crypto","eventemitter"],function(e,n,r,i,s){if(e.browser.msie)return undefined;var o={BigInt:r,CryptoJS:i,EventEmitter:s,OTR:{},DSA:{}};return t.call(o)}):(e.OTR={},e.DSA={},t.call(e))}(this,function(){return function(){"use strict";var e=this,t={N:"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF",G:"2",MSGSTATE_PLAINTEXT:0,MSGSTATE_ENCRYPTED:1,MSGSTATE_FINISHED:2,AUTHSTATE_NONE:0,AUTHSTATE_AWAITING_DHKEY:1,AUTHSTATE_AWAITING_REVEALSIG:2,AUTHSTATE_AWAITING_SIG:3,WHITESPACE_TAG:"                                                             ",WHITESPACE_TAG_V2:"                          ",WHITESPACE_TAG_V3:"                                  ",OTR_TAG:"?OTR",OTR_VERSION_1:"\0\ 1",OTR_VERSION_2:"\0\ 2",OTR_VERSION_3:"\0\ 3",SMPSTATE_EXPECT0:0,SMPSTATE_EXPECT1:1,SMPSTATE_EXPECT2:2,SMPSTATE_EXPECT3:3,SMPSTATE_EXPECT4:4,STATUS_SEND_QUERY:0,STATUS_AKE_INIT:1,STATUS_AKE_SUCCESS:2,STATUS_END_OTR:3};typeof module!="undefined"&&module.exports?module.exports=t:e.OTR.CONST=t}.call(this),function(){"use strict";var e=this,t={},n,r;typeof module!="undefined"&&module.exports?(module.exports=t={},n=require("../vendor/crypto.js"),r=require("../vendor/bigint.js")):(e.OTR&&(e.OTR.HLP=t),e.DSA&&(e.DSA.HLP=t),n=e.CryptoJS,r=e.BigInt);var i={BYTE:1,SHORT:2,INT:4,CTR:8,MAC:20,SIG:40},s="?OTR",o=".",u=r.str2bigInt("2",10);t.debug=function(e){this.debug&&typeof this.debug!="function"&&typeof console!="undefined"&&console.log(e)},t.extend=function(e,t){function r(){this.constructor=e}for(var n in t)Object.hasOwnProperty.call(t,n)&&(e[n]=t[n]);r.prototype=t.prototype,e.prototype=new r,e.__super__=t.prototype},t.compare=function(e,t){if(e.length!==t.length)return!1;var n=0,r=0;for(;n<e.length;n++)r|=e[n].charCodeAt(0)^t[n].charCodeAt(0);return r===0},t.randomExponent=function(){return r.randBigInt(1536)},t.smpHash=function(e,r,s){var o=n.algo.SHA256.create();o.update(n.enc.Latin1.parse(t.packBytes(e,i.BYTE))),o.update(n.enc.Latin1.parse(t.packMPI(r))),s&&o.update(n.enc.Latin1.parse(t.packMPI(s)));var u=o.finalize();return t.bits2bigInt(u.toString(n.enc.Latin1))},t.makeMac=function(e,r){var i=n.enc.Latin1.parse(r),s=n.HmacSHA256(n.enc.Latin1.parse(e),i);return t.mask(s.toString(n.enc.Latin1),0,160)},t.make1Mac=function(e,t){var r=n.enc.Latin1.parse(t),i=n.HmacSHA1(n.enc.Latin1.parse(e),r);return i.toString(n.enc.Latin1)},t.encryptAes=function(e,t,r){var i={mode:n.mode.CTR,iv:n.enc.Latin1.parse(r),padding:n.pad.NoPadding},s=n.AES.encrypt(e,n.enc.Latin1.parse(t),i),o=n.enc.Base64.parse(s.toString());return n.enc.Latin1.stringify(o)},t.decryptAes=function(e,t,r){e=n.enc.Latin1.parse(e);var i={mode:n.mode.CTR,iv:n.enc.Latin1.parse(r),padding:n.pad.NoPadding};return n.AES.decrypt(n.enc.Base64.stringify(e),n.enc.Latin1.parse(t),i)},t.multPowMod=function(e,t,n,i,s){return r.multMod(r.powMod(e,t,s),r.powMod(n,i,s),s)},t.ZKP=function(e,n,i,s){return r.equals(n,t.smpHash(e,i,s))},t.GTOE=function(e,t){return r.equals(e,t)||r.greater(e,t)},t.between=function(e,t,n){return r.greater(e,t)&&r.greater(n,e)},t.checkGroup=function(e,n){return t.GTOE(e,u)&&t.GTOE(n,e)},t.h1=function(e,t){var r=n.algo.SHA1.create();return r.update(n.enc.Latin1.parse(e)),r.update(n.enc.Latin1.parse(t)),r.finalize().toString(n.enc.Latin1)},t.h2=function(e,t){var r=n.algo.SHA256.create();return r.update(n.enc.Latin1.parse(e)),r.update(n.enc.Latin1.parse(t)),r.finalize().toString(n.enc.Latin1)},t.mask=function(e,t,n){return e.substr(t/8,n/8)};var a=String.fromCharCode;t.packBytes=function(e,t){e=e.toString(16);var n,r="";for(;t>0;t--)n=e.length?e.substr(-2,2):"0",e=e.substr(0,e.length-2),r=a(parseInt(n,16))+r;return r},t.packINT=function(e){return t.packBytes(e,i.INT)},t.packCtr=function(e){return t.padCtr(t.packBytes(e,i.CTR))},t.padCtr=function(e){return e+"\0\0\0\0\0\0\0\0"},t.unpackCtr=function(e){return e=t.toByteArray(e.substring(0,8)),t.unpack(e)},t.unpack=function(e){var t=0,n=0,r=e.length;for(;n<r;n++)t=t*256+e[n];return t},t.packData=function(e){return t.packINT(e.length)+e},t.bits2bigInt=function(e){return e=t.toByteArray(e),r.ba2bigInt(e)},t.packMPI=function(e){return t.packData(r.bigInt2bits(r.trim(e,0)))},t.packSHORT=function(e){return t.packBytes(e,i.SHORT)},t.unpackSHORT=function(e){return e=t.toByteArray(e),t.unpack(e)},t.packTLV=function(e,n){return t.packSHORT(e)+t.packSHORT(n.length)+n},t.readLen=function(e){return e=t.toByteArray(e.substring(0,4)),t.unpack(e)},t.readData=function(e){var n=t.unpack(e.splice(0,4));return[n,e]},t.readMPI=function(e){return e=t.toByteArray(e),e=t.readData(e),r.ba2bigInt(e[1])},t.packMPIs=function(e){return e.reduce(function(e,n){return e+t.packMPI(n)},"")},t.unpackMPIs=function(e,n){var r=0,i=[];for(;r<e;r++)i.push("MPI");return t.splitype(i,n).map(function(e){return t.readMPI(e)})},t.wrapMsg=function(e,r,i,u,a){e=n.enc.Base64.stringify(n.enc.Latin1.parse(e)),e=s+":"+e+o;var f;i&&(f="|",f+=t.readLen(u).toString(16),f+="|",f+=t.readLen(a).toString(16));if(!r)return[null,e];var l=Math.ceil(e.length/r);if(l>65535)return["Too many fragments"];if(l==1)return[null,e];var c,h,p,d,v,m=[];for(c=1;c<=l;c++)h=(c-1)*r,p=c*r,d=e.slice(h,p),v=s,i&&(v+=f),v+=","+c+",",v+=l+",",v+=d+",",m.push(v);return[null,m]},t.splitype=function l(e,n){var r=[];return e.forEach(function(e){var s;switch(e){case"PUBKEY":s=l(["SHORT","MPI","MPI","MPI","MPI"],n).join("");break;case"DATA":case"MPI":s=n.substring(0,t.readLen(n)+4);break;default:s=n.substring(0,i[e])}r.push(s),n=n.substring(s.length)}),r};var f=function(){var e=0,t={};for(;e<256;++e)t[String.fromCharCode(e)]=e;for(e=128;e<256;++e)t[String.fromCharCode(63232+e)]=e;return t}();t.toByteArray=function(e){var t=[],n=e.split(""),r=-1,i=n.length,s=i%8;while(s--)++r,t[r]=f[n[r]];s=i>>3;while(s--)t.push(f[n[++r]],f[n[++r]],f[n[++r]],f[n[++r]],f[n[++r]],f[n[++r]],f[n[++r]],f[n[++r]]);return t}}.call(this),function(){"use strict";function c(){var e=(new Date).getTime();return function(t){if(!l||typeof console=="undefined")return;var n=(new Date).getTime();console.log(t+": "+(n-e)),e=n}}function h(e,t){var r=n.randBigInt(n.bitSize(t));return s.between(r,e,t)?r:h(e,t)}function d(e,t){var r,i=3e4,s=n.bitSize(e),o=n.primes;o.length===0&&(o=n.findPrimes(i)),p.length!=e.length&&(p=n.dup(e));for(r=0;r<o.length&&o[r]<=i;r++)if(n.modInt(e,o[r])===0&&!n.equalsInt(e,o[r]))return 0;for(r=0;r<t;r++){n.randBigInt_(p,s,0);while(!n.greater(e,p))n.randBigInt_(p,s,0);if(!n.millerRabin(e,p))return 0}return 1}function g(e){var t=c(),r=v[e].repeat,i=v[e].N,s=n.twoToThe(e-1),o=4*e,f=!1,l,h,p,g;for(;;){l=n.randBigInt(i,1),l[0]|=1;if(!d(l,r))continue;t("q");for(g=0;g<o;g++){h=n.randBigInt(e,1),h[0]|=1,p=n.mod(h,l),p=n.sub(p,u),h=n.sub(h,p);if(n.greater(s,h))continue;if(!d(h,r))continue;t("p"),m[e]={p:h,q:l},f=!0;break}if(f)break}var y=n.dup(a),b=n.sub(h,u),w=n.multMod(b,n.inverseMod(l,h),h),E;for(;;){E=n.powMod(y,w,h);if(n.equals(E,u)){y=n.add(y,u);continue}m[e].g=E,t("g");return}throw new Error("Unreachable!")}function y(e,t){if(!(this instanceof y))return new y(e,t);t=t||{};if(e){var r=this;["p","q","g","y","x"].forEach(function(t){r[t]=e[t]}),this.type=e.type||f;return}var i=parseInt(t.bit_length?t.bit_length:1024,10);if(!v[i])throw new Error("Unsupported bit length.");m[i]||g(i),this.p=m[i].p,this.q=m[i].q,this.g=m[i].g,this.type=f,this.x=h(o,this.q),this.y=n.powMod(this.g,this.x,this.p),t.nocache&&(m[i]=null)}function b(e){var t,n;t=e.indexOf("("),n=e.lastIndexOf(")");if(t<0||n<0)throw new Error("Malformed S-Expression");e=e.substring(t+1,n);var r=e.search(/\s/),i={type:e.substring(0,r),val:[]};e=e.substring(r+1,n),t=e.indexOf("(");if(t<0)i.val.push(e);else{var s,o,u,a;while(t>-1){s=t+1,o=e.length;for(u=1,a=0;s<o&&a<u;s++)e[s]==="("&&u++,e[s]===")"&&a++;i.val.push(b(e.substring(t,++s))),e=e.substring(++s),t=e.indexOf("(")}}return i}function w(e){if(!e.type)throw new Error("Parse error.");var t,r;return e.type==="privkeys"?(t=[],e.val.forEach(function(e){t.push(w(e))}),t):(t={},e.val.forEach(function(e){r=e.val[0],typeof r=="string"?r.indexOf("#")===0&&(r=r.substring(1,r.lastIndexOf("#")),r=n.str2bigInt(r,16)):r=w(e),t[e.type]=r}),t)}var e=this,t,n,r,i,s;typeof module!="undefined"&&module.exports?(module.exports=y,t=require("../vendor/crypto.js"),n=require("../vendor/bigint.js"),i=require("path").join(__dirname,"/dsa-webworker.js"),s=require("./helpers.js")):(Object.keys(e.DSA).forEach(function(t){y[t]=e.DSA[t]}),e.DSA=y,t=e.CryptoJS,n=e.BigInt,r=e.Worker,i="dsa-webworker.js",s=y.HLP);var o=n.str2bigInt("0",10),u=n.str2bigInt("1",10),a=n.str2bigInt("2",10),f="\0\0",l=!1,p=[],v={1024:{N:160,repeat:40},2048:{N:224,repeat:56}},m={};y.prototype={constructor:y,packPublic:function(){var e=this.type;return e+=s.packMPI(this.p),e+=s.packMPI(this.q),e+=s.packMPI(this.g),e+=s.packMPI(this.y),e},packPrivate:function(){var e=this.packPublic()+s.packMPI(this.x);return e=t.enc.Latin1.parse(e),e.toString(t.enc.Base64)},generateNonce:function(e){var r=n.bigInt2bits(n.trim(this.x,0)),i=n.bigInt2bits(n.randBigInt(256)),u=t.algo.SHA256.create();u.update(t.enc.Latin1.parse(r)),u.update(e),u.update(t.enc.Latin1.parse(i));var a=u.finalize();return a=s.bits2bigInt(a.toString(t.enc.Latin1)),n.rightShift_(a,256-n.bitSize(this.q)),s.between(a,o,this.q)?a:this.generateNonce(e)},sign:function(e){e=t.enc.Latin1.parse(e);var r=n.str2bigInt(e.toString(t.enc.Hex),16),i,s=o,u=o;while(n.isZero(u)||n.isZero(s)){i=this.generateNonce(e),s=n.mod(n.powMod(this.g,i,this.p),this.q);if(n.isZero(s))continue;u=n.inverseMod(i,this.q),u=n.mult(u,n.add(r,n.mult(this.x,s))),u=n.mod(u,this.q)}return[s,u]},fingerprint:function(){var e=this.packPublic();return this.type===f&&(e=e.substring(2)),e=t.enc.Latin1.parse(e),t.SHA1(e).toString(t.enc.Hex)}},y.parsePublic=function(e,t){var n=["SHORT","MPI","MPI","MPI","MPI"];t&&n.push("MPI"),e=s.splitype(n,e);var r={type:e[0],p:s.readMPI(e[1]),q:s.readMPI(e[2]),g:s.readMPI(e[3]),y:s.readMPI(e[4])};return t&&(r.x=s.readMPI(e[5])),new y(r)},y.parsePrivate=function(e,n){return n?w(b(e))[0]["private-key"].dsa:(e=t.enc.Base64.parse(e),e=e.toString(t.enc.Latin1),y.parsePublic(e,!0))},y.verify=function(e,r,i,u){if(!s.between(i,o,e.q)||!s.between(u,o,e.q))return!1;var a=t.enc.Latin1.parse(r);a=n.str2bigInt(a.toString(t.enc.Hex),16);var f=n.inverseMod(u,e.q),l=n.multMod(a,f,e.q),c=n.multMod(i,f,e.q);l=n.powMod(e.g,l,e.p),c=n.powMod(e.y,c,e.p);var h=n.mod(n.multMod(l,c,e.p),e.q);return n.equals(h,i)},y.createInWebWorker=function(e,t){var s={path:i,seed:n.getSeed};e&&typeof e=="object"&&Object.keys(e).forEach(function(t){s[t]=e[t]}),typeof module!="undefined"&&module.exports&&(r=require("webworker-threads").Worker);var o=new r(s.path);o.onmessage=function(e){var n=e.data;switch(n.type){case"debug":if(!l||typeof console=="undefined")return;console.log(n.val);break;case"data":o.terminate(),t(y.parsePrivate(n.val));break;default:throw new Error("Unrecognized type.")}},o.postMessage({seed:s.seed(),imports:s.imports,debug:l})}}.call(this),function(){"use strict";var e=this,t={},n,r,i;typeof module!="undefined"&&module.exports?(module.exports=t,n=require("../vendor/crypto.js"),r=require("./const.js"),i=require("./helpers.js")):(e.OTR.Parse=t,n=e.CryptoJS,r=e.OTR.CONST,i=e.OTR.HLP);var s={};s[r.WHITESPACE_TAG_V2]=r.OTR_VERSION_2,s[r.WHITESPACE_TAG_V3]=r.OTR_VERSION_3,t.parseMsg=function(e,t){var o=[],u=t.indexOf(r.OTR_TAG);if(!~u){this.initFragment(e),l=t.indexOf(r.WHITESPACE_TAG);if(~l){t=t.split(""),t.splice(l,16);var a,f=t.length;for(;l<f;){a=t.slice(l,l+8).join("");if(Object.hasOwnProperty.call(s,a)){t.splice(l,8),o.push(s[a]);continue}l+=8}t=t.join("")}return{msg:t,ver:o}}var l=u+r.OTR_TAG.length,c=t[l];if(c===","||c==="|")return this.msgFragment(e,t.substring(l+1),c==="|");this.initFragment(e);if(~["?","v"].indexOf(c)){t[l]==="?"&&(o.push(r.OTR_VERSION_1),l+=1);var h={2:r.OTR_VERSION_2,3:r.OTR_VERSION_3},p=t.substring(l+1),d=p.indexOf("?");return d>=1&&(p=p.substring(0,d).split(""),t[l]==="v"&&p.forEach(function(e){Object.hasOwnProperty.call(h,e)&&o.push(h[e])})),{cls:"query",ver:o}}if(c===":"){l+=1;var v=t.substring(l,l+4);if(v.length<4)return{msg:t};v=n.enc.Base64.parse(v).toString(n.enc.Latin1);var m=v.substring(0,2),g=v.substring(2);if(!e["ALLOW_V"+i.unpackSHORT(m)])return{msg:t};l+=4;var y=t.substring(l).indexOf(".");if(!~y)return{msg:t};t=n.enc.Base64.parse(t.substring(l,l+y)),t=n.enc.Latin1.stringify(t);var b;m===r.OTR_VERSION_3&&(b=t.substring(0,8),t=t.substring(8));var w;return~["\ 2","\n","\11","\12"].indexOf(g)?w="ake":g==="\ 3"&&(w="data"),{version:m,type:g,msg:t,cls:w,instance_tags:b}}return t.substring(l,l+7)===" Error:"?(e.ERROR_START_AKE&&e.sendQueryMsg(),{msg:t.substring(l+7),cls:"error"}):{msg:t}},t.initFragment=function(e){e.fragment={s:"",j:0,k:0}},t.msgFragment=function(e,t,n){t=t.split(",");if(n){var r=t.shift().split("|"),s=i.packINT(parseInt(r[0],16)),o=i.packINT(parseInt(r[1],16));if(e.checkInstanceTags(s+o))return}if(t.length<4||isNaN(parseInt(t[0],10))||isNaN(parseInt(t[1],10)))return;var u=parseInt(t[0],10),a=parseInt(t[1],10);t=t[2];if(a<u||a===0||u===0){this.initFragment(e);return}u===1?(this.initFragment(e),e.fragment={k:1,n:a,s:t}):a===e.fragment.n&&u===e.fragment.k+1?(e.fragment.s+=t,e.fragment.k+=1):this.initFragment(e);if(a===u)return t=e.fragment.s,this.initFragment(e),this.parseMsg(e,t);return}}.call(this),function(){"use strict";function a(e,n,r,s,o){var u=t.enc.Latin1.parse(o),a=t.algo.HMAC.create(t.algo.SHA256,u);return a.update(t.enc.Latin1.parse(i.packMPI(e))),a.update(t.enc.Latin1.parse(i.packMPI(n))),a.update(t.enc.Latin1.parse(r)),a.update(t.enc.Latin1.parse(s)),a.finalize().toString(t.enc.Latin1)}function f(e){if(!(this instanceof f))return new f(e);this.otr=e,this.our_dh=e.our_old_dh,this.our_keyid=e.our_keyid-1,this.their_y=null,this.their_keyid=null,this.their_priv_pk=null,this.ssid=null,this.transmittedRS=!1,this.r=null;var t=this;["sendMsg"].forEach(function(e){t[e]=t[e].bind(t)})}var e=this,t,n,r,i,s;typeof module!="undefined"&&module.exports?(module.exports=f,t=require("../vendor/crypto.js"),n=require("../vendor/bigint.js"),r=require("./const.js"),i=require("./helpers.js"),s=require("./dsa.js")):(e.OTR.AKE=f,t=e.CryptoJS,n=e.BigInt,r=e.OTR.CONST,i=e.OTR.HLP,s=e.DSA);var o=n.str2bigInt(r.N,16),u=n.sub(o,n.str2bigInt("2",10));f.prototype={constructor:f,createKeys:function(e){var t=n.powMod(e,this.our_dh.privateKey,o),r=i.packMPI(t);this.ssid=i.mask(i.h2("\0",r),0,64);var s=i.h2("\ 1",r);this.c=i.mask(s,0,128),this.c_prime=i.mask(s,128,128),this.m1=i.h2("\ 2",r),this.m2=i.h2("\ 3",r),this.m1_prime=i.h2("\ 4",r),this.m2_prime=i.h2("\ 5",r)},verifySignMac:function(e,n,r,o,u,f,l,c){var h=i.makeMac(n,r);if(!i.compare(e,h))return["MACs do not match."];var p=i.decryptAes(n.substring(4),o,c);p=i.splitype(["PUBKEY","INT","SIG"],p.toString(t.enc.Latin1));var d=a(u,f,p[0],p[1],l),v=s.parsePublic(p[0]),m=i.bits2bigInt(p[2].substring(0,20)),g=i.bits2bigInt(p[2].substring(20));return s.verify(v,d,m,g)?[null,i.readLen(p[1]),v]:["Cannot verify signature of m."]},makeM:function(e,r,s,o){var u=this.otr.priv.packPublic(),f=i.packINT(this.our_keyid),l=a(this.our_dh.publicKey,e,u,f,r);l=this.otr.priv.sign(l);var c=u+f;c+=n.bigInt2bits(l[0],20),c+=n.bigInt2bits(l[1],20),c=t.enc.Latin1.parse(c);var h=i.packData(i.encryptAes(c,s,i.packCtr(0))),p=i.makeMac(h,o);return h+p},akeSuccess:function(e){i.debug.call(this.otr,"success");if(n.equals(this.their_y,this.our_dh.publicKey))return this.otr.error("equal keys - we have a problem.",!0);this.otr.our_old_dh=this.our_dh,this.otr.their_priv_pk=this.their_priv_pk,this.their_keyid===this.otr.their_keyid&&n.equals(this.their_y,this.otr.their_y)||this.their_keyid===this.otr.their_keyid-1&&n.equals(this.their_y,this.otr.their_old_y)||(this.otr.their_y=this.their_y,this.otr.their_old_y=null,this.otr.their_keyid=this.their_keyid,this.otr.sessKeys[0]=[new this.otr.DHSession(this.otr.our_dh,this.otr.their_y),null],this.otr.sessKeys[1]=[new this.otr.DHSession(this.otr.our_old_dh,this.otr.their_y),null]),this.otr.ssid=this.ssid,this.otr.transmittedRS=this.transmittedRS,this.otr_version=e,this.otr.authstate=r.AUTHSTATE_NONE,this.otr.msgstate=r.MSGSTATE_ENCRYPTED,this.r=null,this.myhashed=null,this.dhcommit=null,this.encrypted=null,this.hashed=null,this.otr.trigger("status",[r.STATUS_AKE_SUCCESS]),this.otr.sendStored()},handleAKE:function(e){var s,o,a,f=e.version;switch(e.type){case"\ 2":i.debug.call(this.otr,"d-h key message"),e=i.splitype(["DATA","DATA"],e.msg);if(this.otr.authstate===r.AUTHSTATE_AWAITING_DHKEY){var l=i.readMPI(this.myhashed),c=i.readMPI(e[1]);if(n.greater(l,c)){a="\ 2",s=this.dhcommit;break}this.our_dh=this.otr.dh(),this.otr.authstate=r.AUTHSTATE_NONE,this.r=null,this.myhashed=null}else this.otr.authstate===r.AUTHSTATE_AWAITING_SIG&&(this.our_dh=this.otr.dh());this.otr.authstate=r.AUTHSTATE_AWAITING_REVEALSIG,this.encrypted=e[0].substring(4),this.hashed=e[1].substring(4),a="\n",s=i.packMPI(this.our_dh.publicKey);break;case"\n":i.debug.call(this.otr,"reveal signature message"),e=i.splitype(["MPI"],e.msg);if(this.otr.authstate!==r.AUTHSTATE_AWAITING_DHKEY){if(this.otr.authstate!==r.AUTHSTATE_AWAITING_SIG)return;if(!n.equals(this.their_y,i.readMPI(e[0])))return}this.otr.authstate=r.AUTHSTATE_AWAITING_SIG,this.their_y=i.readMPI(e[0]);if(!i.checkGroup(this.their_y,u))return this.otr.error("Illegal g^y.",!0);this.createKeys(this.their_y),a="\11",s=i.packMPI(this.r),s+=this.makeM(this.their_y,this.m1,this.c,this.m2),this.m1=null,this.m2=null,this.c=null;break;case"\11":i.debug.call(this.otr,"signature message");if(this.otr.authstate!==r.AUTHSTATE_AWAITING_REVEALSIG)return;e=i.splitype(["DATA","DATA","MAC"],e.msg),this.r=i.readMPI(e[0]);var h=t.enc.Hex.parse(n.bigInt2str(this.r,16));h=t.enc.Latin1.stringify(h);var p=i.decryptAes(this.encrypted,h,i.packCtr(0));p=p.toString(t.enc.Latin1),this.their_y=i.readMPI(p);var d=t.SHA256(t.enc.Latin1.parse(p));if(!i.compare(this.hashed,d.toString(t.enc.Latin1)))return this.otr.error("Hashed g^x does not match.",!0);if(!i.checkGroup(this.their_y,u))return this.otr.error("Illegal g^x.",!0);this.createKeys(this.their_y),o=this.verifySignMac(e[2],e[1],this.m2,this.c,this.their_y,this.our_dh.publicKey,this.m1,i.packCtr(0));if(o[0])return this.otr.error(o[0],!0);this.their_keyid=o[1],this.their_priv_pk=o[2],s=this.makeM(this.their_y,this.m1_prime,this.c_prime,this.m2_prime),this.m1=null,this.m2=null,this.m1_prime=null,this.m2_prime=null,this.c=null,this.c_prime=null,this.sendMsg(f,"\12",s),this.akeSuccess(f);return;case"\12":i.debug.call(this.otr,"data message");if(this.otr.authstate!==r.AUTHSTATE_AWAITING_SIG)return;e=i.splitype(["DATA","MAC"],e.msg),o=this.verifySignMac(e[1],e[0],this.m2_prime,this.c_prime,this.their_y,this.our_dh.publicKey,this.m1_prime,i.packCtr(0));if(o[0])return this.otr.error(o[0],!0);this.their_keyid=o[1],this.their_priv_pk=o[2],this.m1_prime=null,this.m2_prime=null,this.c_prime=null,this.transmittedRS=!0,this.akeSuccess(f);return;default:return}this.sendMsg(f,a,s)},sendMsg:function(e,t,n){var s=e+t,o=e===r.OTR_VERSION_3;o&&(i.debug.call(this.otr,"instance tags"),s+=this.otr.our_instance_tag,s+=this.otr.their_instance_tag),s+=n,s=i.wrapMsg(s,this.otr.fragment_size,o,this.otr.our_instance_tag,this.otr.their_instance_tag);if(s[0])return this.otr.error(s[0]);this.otr.io(s[1])},initiateAKE:function(e){i.debug.call(this.otr,"d-h commit message"),this.otr.trigger("status",[r.STATUS_AKE_INIT]),this.otr.authstate=r.AUTHSTATE_AWAITING_DHKEY;var s=i.packMPI(this.our_dh.publicKey);s=t.enc.Latin1.parse(s),this.r=n.randBigInt(128);var o=t.enc.Hex.parse(n.bigInt2str(this.r,16));o=t.enc.Latin1.stringify(o),this.myhashed=t.SHA256(s),this.myhashed=i.packData(this.myhashed.toString(t.enc.Latin1)),this.dhcommit=i.packData(i.encryptAes(s,o,i.packCtr(0))),this.dhcommit+=this.myhashed,this.sendMsg(e,"\ 2",this.dhcommit)}}}.call(this),function(){"use strict";function l(e){if(!(this instanceof l))return new l(e);this.version=1,this.our_fp=e.our_fp,this.their_fp=e.their_fp,this.ssid=e.ssid,this.debug=!!e.debug,this.init()}var e=this,t,n,r,i,s;typeof module!="undefined"&&module.exports?(module.exports=l,t=require("../vendor/crypto.js"),n=require("../vendor/bigint.js"),r=require("../vendor/eventemitter.js"),i=require("./const.js"),s=require("./helpers.js")):(e.OTR.SM=l,t=e.CryptoJS,n=e.BigInt,r=e.EventEmitter,i=e.OTR.CONST,s=e.OTR.HLP);var o=n.str2bigInt(i.G,10),u=n.str2bigInt(i.N,16),a=n.sub(u,n.str2bigInt("2",10)),f=n.sub(u,n.str2bigInt("1",10));n.divInt_(f,2),s.extend(l,r),l.prototype.init=function(){this.smpstate=i.SMPSTATE_EXPECT1,this.secret=null},l.prototype.makeSecret=function(e,n){var r=t.algo.SHA256.create();r.update(t.enc.Latin1.parse(s.packBytes(this.version,1))),r.update(t.enc.Hex.parse(e?this.our_fp:this.their_fp)),r.update(t.enc.Hex.parse(e?this.their_fp:this.our_fp)),r.update(t.enc.Latin1.parse(this.ssid)),r.update(t.enc.Latin1.parse(n));var i=r.finalize();this.secret=s.bits2bigInt(i.toString(t.enc.Latin1))},l.prototype.makeG2s=function(){this.a2=s.randomExponent(),this.a3=s.randomExponent(),this.g2a=n.powMod(o,this.a2,u),this.g3a=n.powMod(o,this.a3,u),(!s.checkGroup(this.g2a,a)||!s.checkGroup(this.g3a,a))&&this.makeG2s()},l.prototype.computeGs=function(e,t){this.g2=n.powMod(e,this.a2,u),this.g3=n.powMod(t,this.a3,u)},l.prototype.computePQ=function(e){this.p=n.powMod(this.g3,e,u),this.q=s.multPowMod(o,e,this.g2,this.secret,u)},l.prototype.computeR=function(){this.r=n.powMod(this.QoQ,this.a3,u)},l.prototype.computeRab=function(e){return n.powMod(e,this.a3,u)},l.prototype.computeC=function(e,t){return s.smpHash(e,n.powMod(o,t,u))},l.prototype.computeD=function(e,t,r){return n.subMod(e,n.multMod(t,r,f),f)},l.prototype.handleSM=function(e){var r,f,l,c,h,p,d,v,m,g,y,b,w,E,S={2:i.SMPSTATE_EXPECT1,3:i.SMPSTATE_EXPECT2,4:i.SMPSTATE_EXPECT3,5:i.SMPSTATE_EXPECT4,7:i.SMPSTATE_EXPECT1};if(e.type===6){this.init(),this.trigger("abort");return}if(this.smpstate!==S[e.type])return this.abort();switch(this.smpstate){case i.SMPSTATE_EXPECT1:s.debug.call(this,"smp tlv 2");var x,T;e.type===7&&(x=e.msg.indexOf("\0"),T=e.msg.substring(0,x),e.msg=e.msg.substring(x+1)),w=s.readLen(e.msg.substr(0,4));if(w!==6)return this.abort();e=s.unpackMPIs(6,e.msg.substring(4));if(!s.checkGroup(e[0],a)||!s.checkGroup(e[3],a))return this.abort();if(!s.ZKP(1,e[1],s.multPowMod(o,e[2],e[0],e[1],u)))return this.abort();if(!s.ZKP(2,e[4],s.multPowMod(o,e[5],e[3],e[4],u)))return this.abort();this.g3ao=e[3],this.makeG2s(),f=s.randomExponent(),l=s.randomExponent(),this.c2=this.computeC(3,f),this.c3=this.computeC(4,l),this.d2=this.computeD(f,this.a2,this.c2),this.d3=this.computeD(l,this.a3,this.c3),this.computeGs(e[0],e[3]),this.smpstate=i.SMPSTATE_EXPECT0,T=t.enc.Latin1.parse(T).toString(t.enc.Utf8),this.trigger("question",[T]);return;case i.SMPSTATE_EXPECT2:s.debug.call(this,"smp tlv 3"),w=s.readLen(e.msg.substr(0,4));if(w!==11)return this.abort();e=s.unpackMPIs(11,e.msg.substring(4));if(!s.checkGroup(e[0],a)||!s.checkGroup(e[3],a)||!s.checkGroup(e[6],a)||!s.checkGroup(e[7],a))return this.abort();if(!s.ZKP(3,e[1],s.multPowMod(o,e[2],e[0],e[1],u)))return this.abort();if(!s.ZKP(4,e[4],s.multPowMod(o,e[5],e[3],e[4],u)))return this.abort();this.g3ao=e[3],this.computeGs(e[0],e[3]),h=s.multPowMod(this.g3,e[9],e[6],e[8],u),p=s.multPowMod(o,e[9],this.g2,e[10],u),p=n.multMod(p,n.powMod(e[7],e[8],u),u);if(!s.ZKP(5,e[8],h,p))return this.abort();var C=s.randomExponent();this.computePQ(C);var k=s.randomExponent(),L=s.randomExponent(),A=s.multPowMod(o,k,this.g2,L,u),O=s.smpHash(6,n.powMod(this.g3,k,u),A),M=this.computeD(k,C,O),_=this.computeD(L,this.secret,O);this.QoQ=n.divMod(this.q,e[7],u),this.PoP=n.divMod(this.p,e[6],u),this.computeR(),c=s.randomExponent(),g=n.powMod(this.QoQ,c,u),y=s.smpHash(7,n.powMod(o,c,u),g),b=this.computeD(c,this.a3,y),this.smpstate=i.SMPSTATE_EXPECT4,r=s.packINT(8)+s.packMPIs([this.p,this.q,O,M,_,this.r,y,b]),r=s.packTLV(4,r);break;case i.SMPSTATE_EXPECT3:s.debug.call(this,"smp tlv 4"),w=s.readLen(e.msg.substr(0,4));if(w!==8)return this.abort();e=s.unpackMPIs(8,e.msg.substring(4));if(!s.checkGroup(e[0],a)||!s.checkGroup(e[1],a)||!s.checkGroup(e[5],a))return this.abort();h=s.multPowMod(this.g3,e[3],e[0],e[2],u),p=s.multPowMod(o,e[3],this.g2,e[4],u),p=n.multMod(p,n.powMod(e[1],e[2],u),u);if(!s.ZKP(6,e[2],h,p))return this.abort();d=s.multPowMod(o,e[7],this.g3ao,e[6],u),this.QoQ=n.divMod(e[1],this.q,u),v=s.multPowMod(this.QoQ,e[7],e[5],e[6],u);if(!s.ZKP(7,e[6],d,v))return this.abort();this.computeR(),c=s.randomExponent(),g=n.powMod(this.QoQ,c,u),y=s.smpHash(8,n.powMod(o,c,u),g),b=this.computeD(c,this.a3,y),r=s.packINT(3)+s.packMPIs([this.r,y,b]),r=s.packTLV(5,r),m=this.computeRab(e[5]),E=!!n.equals(m,n.divMod(e[0],this.p,u)),this.trigger("trust",[E,"answered"]),this.init();break;case i.SMPSTATE_EXPECT4:s.debug.call(this,"smp tlv 5"),w=s.readLen(e.msg.substr(0,4));if(w!==3)return this.abort();e=s.unpackMPIs(3,e.msg.substring(4));if(!s.checkGroup(e[0],a))return this.abort();d=s.multPowMod(o,e[2],this.g3ao,e[1],u),v=s.multPowMod(this.QoQ,e[2],e[0],e[1],u);if(!s.ZKP(8,e[1],d,v))return this.abort();m=this.computeRab(e[0]),E=!!n.equals(m,this.PoP),this.trigger("trust",[E,"asked"]),this.init();return}this.sendMsg(r)},l.prototype.sendMsg=function(e){this.trigger("send",[this.ssid,"\0"+e])},l.prototype.rcvSecret=function(e,t){s.debug.call(this,"receive secret");var n,r=!1;this.smpstate===i.SMPSTATE_EXPECT0?n=this.answer:(n=this.initiate,r=!0),this.makeSecret(r,e),n.call(this,t)},l.prototype.answer=function(){s.debug.call(this,"smp answer");var e=s.randomExponent();this.computePQ(e);var t=s.randomExponent(),r=s.randomExponent(),a=s.multPowMod(o,t,this.g2,r,u),f=s.smpHash(5,n.powMod(this.g3,t,u),a),l=this.computeD(t,e,f),c=this.computeD(r,this.secret,f);this.smpstate=i.SMPSTATE_EXPECT3;var h=s.packINT(11)+s.packMPIs([this.g2a,this.c2,this.d2,this.g3a,this.c3,this.d3,this.p,this.q,f,l,c]);this.sendMsg(s.packTLV(3,h))},l.prototype.initiate=function(e){s.debug.call(this,"smp initiate"),this.smpstate!==i.SMPSTATE_EXPECT1&&this.abort(),this.makeG2s();var t=s.randomExponent(),n=s.randomExponent();this.c2=this.computeC(1,t),this.c3=this.computeC(2,n),this.d2=this.computeD(t,this.a2,this.c2),this.d3=this.computeD(n,this.a3,this.c3),this.smpstate=i.SMPSTATE_EXPECT2;var r="",o=2;e&&(r+=e,r+="\0",o=7),r+=s.packINT(6)+s.packMPIs([this.g2a,this.c2,this.d2,this.g3a,this.c3,this.d3]),this.sendMsg(s.packTLV(o,r))},l.prototype.abort=function(){this.init(),this.sendMsg(s.packTLV(6,"")),this.trigger("abort")}}.call(this),function(){"use strict";function m(e){if(!(this instanceof m))return new m(e);e=e||{};if(!(!e.priv||e.priv instanceof c))throw new Error("Requires long-lived DSA key.");this.priv=e.priv?e.priv:new c,this.fragment_size=e.fragment_size||0;if(this.fragment_size<0)throw new Error("Fragment size must be a positive integer.");this.send_interval=e.send_interval||0;if(this.send_interval<0)throw new Error("Send interval must be a positive integer.");this.outgoing=[],this.our_instance_tag=e.instance_tag||m.makeInstanceTag(),this.debug=!!e.debug,this.smw=e.smw,this.init();var t=this;["sendMsg","receiveMsg"].forEach(function(e){t[e]=t[e].bind(t)}),r.call(this)}var e=this,t,n,r,i,s,o,u,a,f,l,c;typeof module!="undefined"&&module.exports?(module.exports=m,t=require("../vendor/crypto.js"),n=require("../vendor/bigint.js"),r=require("../vendor/eventemitter.js"),s=require("path").join(__dirname,"/sm-webworker.js"),o=require("./const.js"),u=require("./helpers.js"),a=require("./parse.js"),f=require("./ake.js"),l=require("./sm.js"),c=require("./dsa.js"),m.CONST=o):(Object.keys(e.OTR).forEach(function(t){m[t]=e.OTR[t]}),e.OTR=m,t=e.CryptoJS,n=e.BigInt,r=e.EventEmitter,i=e.Worker,s="sm-webworker.js",o=m.CONST,u=m.HLP,a=m.Parse,f=m.AKE,l=m.SM,c=e.DSA);var h=n.str2bigInt(o.G,10),p=n.str2bigInt(o.N,16),d=Math.pow(2,53)-1,v=Math.pow(2,31)-1;u.extend(m,r),m.prototype.init=function(){this.msgstate=o.MSGSTATE_PLAINTEXT,this.authstate=o.AUTHSTATE_NONE,this.ALLOW_V2=!0,this.ALLOW_V3=!0,this.REQUIRE_ENCRYPTION=!1,this.SEND_WHITESPACE_TAG=!1,this.WHITESPACE_START_AKE=!1,this.ERROR_START_AKE=!1,a.initFragment(this),this.their_y=null,this.their_old_y=null,this.their_keyid=0,this.their_priv_pk=null,this.their_instance_tag="\0\0\0\0",this.our_dh=this.dh(),this.our_old_dh=this.dh(),this.our_keyid=2,this.sessKeys=[new Array(2),new Array(2)],this.storedMgs=[],this.oldMacKeys=[],this.sm=null,this._akeInit(),this.receivedPlaintext=!1},m.prototype._akeInit=function(){this.ake=new f(this),this.transmittedRS=!1,this.ssid=null},m.prototype._SMW=function(e,t){this.otr=e;var r={path:s,seed:n.getSeed};typeof e.smw=="object"&&Object.keys(e.smw).forEach(function(t){r[t]=e.smw[t]}),typeof module!="undefined"&&module.exports&&(i=require("webworker-threads").Worker),this.worker=new i(r.path);var o=this;this.worker.onmessage=function(e){var t=e.data;if(!t)return;o.trigger(t.method,t.args)},this.worker.postMessage({type:"seed",seed:r.seed(),imports:r.imports}),this.worker.postMessage({type:"init",reqs:t})},u.extend(m.prototype._SMW,r),["handleSM","rcvSecret","abort"].forEach(function(e){m.prototype._SMW.prototype[e]=function(){this.worker.postMessage({type:"method",method:e,args:Array.prototype.slice.call(arguments,0)})}}),m.prototype._smInit=function(){var e={ssid:this.ssid,our_fp:this.priv.fingerprint(),their_fp:this.their_priv_pk.fingerprint(),debug:this.debug};this.smw?(this.sm&&this.sm.worker.terminate(),this.sm=new this._SMW(this,e)):this.sm=new l(e);var t=this;["trust","abort","question"].forEach(function(e){t.sm.on(e,function(){t.trigger("smp",[e].concat(Array.prototype.slice.call(arguments)))})}),this.sm.on("send",function(e,n){t.ssid===e&&(n=t.prepareMsg(n),t.io(n))})},m.prototype.io=function(e,t){e=[].concat(e).map(function(e){return{msg:e,meta:t}}),this.outgoing=this.outgoing.concat(e);var n=this;(function r(e){if(!e){if(!n.outgoing.length)return;var t=n.outgoing.shift();n.trigger("io",[t.msg,t.meta])}setTimeout(r,e?0:n.send_interval)})(!0)},m.prototype.dh=function(){var t={privateKey:n.randBigInt(320)};return t.publicKey=n.powMod(h,t.privateKey,p),t},m.prototype.DHSession=function g(e,r){if(!(this instanceof g))return new g(e,r);var i=n.powMod(r,e.privateKey,p),s=u.packMPI(i);this.id=u.mask(u.h2("\0",s),0,64);var o=n.greater(e.publicKey,r),a=o?"\ 1":"\ 2",f=o?"\ 2":"\ 1";this.sendenc=u.mask(u.h1(a,s),0,128),this.sendmac=t.SHA1(t.enc.Latin1.parse(this.sendenc)),this.sendmac=this.sendmac.toString(t.enc.Latin1),this.rcvenc=u.mask(u.h1(f,s),0,128),this.rcvmac=t.SHA1(t.enc.Latin1.parse(this.rcvenc)),this.rcvmac=this.rcvmac.toString(t.enc.Latin1),this.rcvmacused=!1,this.extra_symkey=u.h2("ÿ",s),this.send_counter=0,this.rcv_counter=0},m.prototype.rotateOurKeys=function(){var e=this;this.sessKeys[1].forEach(function(t){t&&t.rcvmacused&&e.oldMacKeys.push(t.rcvmac)}),this.our_old_dh=this.our_dh,this.our_dh=this.dh(),this.our_keyid+=1,this.sessKeys[1][0]=this.sessKeys[0][0],this.sessKeys[1][1]=this.sessKeys[0][1],this.sessKeys[0]=[this.their_y?new this.DHSession(this.our_dh,this.their_y):null,this.their_old_y?new this.DHSession(this.our_dh,this.their_old_y):null]},m.prototype.rotateTheirKeys=function(e){this.their_keyid+=1;var t=this;this.sessKeys.forEach(function(e){e[1]&&e[1].rcvmacused&&t.oldMacKeys.push(e[1].rcvmac)}),this.their_old_y=this.their_y,this.sessKeys[0][1]=this.sessKeys[0][0],this.sessKeys[1][1]=this.sessKeys[1][0],this.their_y=e,this.sessKeys[0][0]=new this.DHSession(this.our_dh,this.their_y),this.sessKeys[1][0]=new this.DHSession(this.our_old_dh,this.their_y)},m.prototype.prepareMsg=function(e,n){if(this.msgstate!==o.MSGSTATE_ENCRYPTED||this.their_keyid===0)return this.error("Not ready to encrypt.");var r=this.sessKeys[1][0];if(r.send_counter>=d)return this.error("Should have rekeyed by now.");r.send_counter+=1;var i=u.packCtr(r.send_counter),s=this.ake.otr_version+"\ 3",a=this.ake.otr_version===o.OTR_VERSION_3;a&&(s+=this.our_instance_tag,s+=this.their_instance_tag),s+="\0",s+=u.packINT(this.our_keyid-1),s+=u.packINT(this.their_keyid),s+=u.packMPI(this.our_dh.publicKey),s+=i.substring(0,8);if(Math.ceil(e.length/8)>=v)return this.error("Message is too long.");var f=u.encryptAes(t.enc.Latin1.parse(e),r.sendenc,i);return s+=u.packData(f),s+=u.make1Mac(s,r.sendmac),s+=u.packData(this.oldMacKeys.splice(0).join("")),s=u.wrapMsg(s,this.fragment_size,a,this.our_instance_tag,this.their_instance_tag),s[0]?this.error(s[0]):(n&&this.trigger("file",["send",r.extra_symkey,n]),s[1])},m.prototype.handleDataMsg=function(e){var n=e.version+e.type;this.ake.otr_version===o.OTR_VERSION_3&&(n+=e.instance_tags);var r=["BYTE","INT","INT","MPI","CTR","DATA","MAC","DATA"];e=u.splitype(r,e.msg);var i=e[0]==="\ 1";if(this.msgstate!==o.MSGSTATE_ENCRYPTED||e.length!==8){i||this.error("Received an unreadable encrypted message.",!0);return}var s=this.our_keyid-u.readLen(e[2]),a=this.their_keyid-u.readLen(e[1]);if(s<0||s>1){i||this.error("Not of our latest keys.",!0);return}if(a<0||a>1){i||this.error("Not of your latest keys.",!0);return}var f=a?this.their_old_y:this.their_y;if(a===1&&!f){i||this.error("Do not have that key.");return}var l=this.sessKeys[s][a],c=u.unpackCtr(e[4]);if(c<=l.rcv_counter){i||this.error("Counter in message is not larger.");return}l.rcv_counter=c,n+=e.slice(0,6).join("");var h=u.make1Mac(n,l.rcvmac);if(!u.compare(e[6],h)){i||this.error("MACs do not match.");return}l.rcvmacused=!0;var p=u.decryptAes(e[5].substring(4),l.rcvenc,u.padCtr(e[4]));p=p.toString(t.enc.Latin1),s||this.rotateOurKeys(),a||this.rotateTheirKeys(u.readMPI(e[3]));var d=p.indexOf("\0");return~d&&(this.handleTLVs(p.substring(d+1),l),p=p.substring(0,d)),p=t.enc.Latin1.parse(p),p.toString(t.enc.Utf8)},m.prototype.handleTLVs=function(e,n){var r,i,s;for(;e.length;){r=u.unpackSHORT(e.substr(0,2)),i=u.unpackSHORT(e.substr(2,2)),s=e.substr(4,i);if(s.length<i)break;switch(r){case 1:this.msgstate=o.MSGSTATE_FINISHED,this.trigger("status",[o.STATUS_END_OTR]);break;case 2:case 3:case 4:case 5:case 6:case 7:if(this.msgstate!==o.MSGSTATE_ENCRYPTED){this.sm&&this.sm.abort();return}this.sm||this._smInit(),this.sm.handleSM({msg:s,type:r});break;case 8:s=s.substring(4),s=t.enc.Latin1.parse(s),s=s.toString(t.enc.Utf8),this.trigger("file",["receive",n.extra_symkey,s])}e=e.substring(4+i)}},m.prototype.smpSecret=function(e,n){if(this.msgstate!==o.MSGSTATE_ENCRYPTED)return this.error("Must be encrypted for SMP.");if(typeof e!="string"||e.length<1)return this.error("Secret is required.");this.sm||this._smInit(),e=t.enc.Utf8.parse(e).toString(t.enc.Latin1),n=t.enc.Utf8.parse(n).toString(t.enc.Latin1),this.sm.rcvSecret(e,n)},m.prototype.sendQueryMsg=function(){var e={},t=o.OTR_TAG;this.ALLOW_V2&&(e[2]=!0),this.ALLOW_V3&&(e[3]=!0);var n=Object.keys(e);n.length&&(t+="v",n.forEach(function(e){e!=="1"&&(t+=e)}),t+="?"),this.io(t),this.trigger("status",[o.STATUS_SEND_QUERY])},m.prototype.sendMsg=function(e,n){if(this.REQUIRE_ENCRYPTION||this.msgstate!==o.MSGSTATE_PLAINTEXT)e=t.enc.Utf8.parse(e),e=e.toString(t.enc.Latin1);switch(this.msgstate){case o.MSGSTATE_PLAINTEXT:if(this.REQUIRE_ENCRYPTION){this.storedMgs.push({msg:e,meta:n}),this.sendQueryMsg();return}this.SEND_WHITESPACE_TAG&&!this.receivedPlaintext&&(e+=o.WHITESPACE_TAG,this.ALLOW_V3&&(e+=o.WHITESPACE_TAG_V3),this.ALLOW_V2&&(e+=o.WHITESPACE_TAG_V2));break;case o.MSGSTATE_FINISHED:this.storedMgs.push({msg:e,meta:n}),this.error("Message cannot be sent at this time.");return;case o.MSGSTATE_ENCRYPTED:e=this.prepareMsg(e);break;default:throw new Error("Unknown message state.")}e&&this.io(e,n)},m.prototype.receiveMsg=function(e){e=a.parseMsg(this,e);if(!e)return;switch(e.cls){case"error":this.error(e.msg);return;case"ake":if(e.version===o.OTR_VERSION_3&&this.checkInstanceTags(e.instance_tags))return;this.ake.handleAKE(e);return;case"data":if(e.version===o.OTR_VERSION_3&&this.checkInstanceTags(e.instance_tags))return;e.msg=this.handleDataMsg(e),e.encrypted=!0;break;case"query":this.msgstate===o.MSGSTATE_ENCRYPTED&&this._akeInit(),this.doAKE(e);break;default:(this.REQUIRE_ENCRYPTION||this.msgstate!==o.MSGSTATE_PLAINTEXT)&&this.error("Received an unencrypted message."),this.receivedPlaintext=!0,this.WHITESPACE_START_AKE&&e.ver.length>0&&this.doAKE(e)}e.msg&&this.trigger("ui",[e.msg,!!e.encrypted])},m.prototype.checkInstanceTags=function(e){var t=u.readLen(e.substr(0,4)),n=u.readLen(e.substr(4,4));if(n&&n!==u.readLen(this.our_instance_tag))return!0;if(u.readLen(this.their_instance_tag)){if(u.readLen(this.their_instance_tag)!==t)return!0}else{if(t<100)return!0;this.their_instance_tag=u.packINT(t)}},m.prototype.doAKE=function(e){this.ALLOW_V3&&~e.ver.indexOf(o.OTR_VERSION_3)?this.ake.initiateAKE(o.OTR_VERSION_3):this.ALLOW_V2&&~e.ver.indexOf(o.OTR_VERSION_2)?this.ake.initiateAKE(o.OTR_VERSION_2):this.error("OTR conversation requested, but no compatible protocol version found.")},m.prototype.error=function(e,t){if(t){this.debug||(e="An OTR error has occurred."),e="?OTR Error:"+e,this.io(e);return}this.trigger("error",[e])},m.prototype.sendStored=function(){var e=this;this.storedMgs.splice(0).forEach(function(t){var n=e.prepareMsg(t.msg);e.io(n,t.meta)})},m.prototype.sendFile=function(e){if(this.msgstate!==o.MSGSTATE_ENCRYPTED)return this.error("Not ready to encrypt.");if(this.ake.otr_version!==o.OTR_VERSION_3)return this.error("Protocol v3 required.");if(!e)return this.error("Please specify a filename.");var n=t.enc.Utf8.parse(e);n=n.toString(t.enc.Latin1);if(n.length>=65532)return this.error("filename is too long.");var r="\0";r+="\0\b",r+=u.packSHORT(4+n.length),r+="\0\0\0\ 1",r+=n,r=this.prepareMsg(r,e),this.io(r)},m.prototype.endOtr=function(){this.msgstate===o.MSGSTATE_ENCRYPTED&&(this.sendMsg("\0\0\ 1\0\0"),this.sm&&(this.smw&&this.sm.worker.terminate(),this.sm=null)),this.msgstate=o.MSGSTATE_PLAINTEXT,this.receivedPlaintext=!1,this.trigger("status",[o.STATUS_END_OTR])},m.makeInstanceTag=function(){var e=n.randBigInt(32);return n.greater(n.str2bigInt("100",16),e)?m.makeInstanceTag():u.packINT(parseInt(n.bigInt2str(e,10),10))}}.call(this),{OTR:this.OTR,DSA:this.DSA}}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?module.exports=t():typeof define=="function"&&define.amd?define("moment",t):e.moment=t()}(this,function(){"use strict";function t(){return e.apply(null,arguments)}function n(t){e=t}function r(e){return Object.prototype.toString.call(e)==="[object Array]"}function i(e){return e instanceof Date||Object.prototype.toString.call(e)==="[object Date]"}function s(e,t){var n=[],r;for(r=0;r<e.length;++r)n.push(t(e[r],r));return n}function o(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function u(e,t){for(var n in t)o(t,n)&&(e[n]=t[n]);return o(t,"toString")&&(e.toString=t.toString),o(t,"valueOf")&&(e.valueOf=t.valueOf),e}function a(e,t,n,r){return gn(e,t,n,r,!0).utc()}function f(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function l(e){return e._pf==null&&(e._pf=f()),e._pf}function c(e){if(e._isValid==null){var t=l(e);e._isValid=!isNaN(e._d.getTime())&&t.overflow<0&&!t.empty&&!t.invalidMonth&&!t.invalidWeekday&&!t.nullInput&&!t.invalidFormat&&!t.userInvalidated,e._strict&&(e._isValid=e._isValid&&t.charsLeftOver===0&&t.unusedTokens.length===0&&t.bigHour===undefined)}return e._isValid}function h(e){var t=a(NaN);return e!=null?u(l(t),e):l(t).userInvalidated=!0,t}function d(e,t){var n,r,i;typeof t._isAMomentObject!="undefined"&&(e._isAMomentObject=t._isAMomentObject),typeof t._i!="undefined"&&(e._i=t._i),typeof t._f!="undefined"&&(e._f=t._f),typeof t._l!="undefined"&&(e._l=t._l),typeof t._strict!="undefined"&&(e._strict=t._strict),typeof t._tzm!="undefined"&&(e._tzm=t._tzm),typeof t._isUTC!="undefined"&&(e._isUTC=t._isUTC),typeof t._offset!="undefined"&&(e._offset=t._offset),typeof t._pf!="undefined"&&(e._pf=l(t)),typeof t._locale!="undefined"&&(e._locale=t._locale);if(p.length>0)for(n in p)r=p[n],i=t[r],typeof i!="undefined"&&(e[r]=i);return e}function m(e){d(this,e),this._d=new Date(e._d!=null?e._d.getTime():NaN),v===!1&&(v=!0,t.updateOffset(this),v=!1)}function g(e){return e instanceof m||e!=null&&e._isAMomentObject!=null}function y(e){return e<0?Math.ceil(e):Math.floor(e)}function b(e){var t=+e,n=0;return t!==0&&isFinite(t)&&(n=y(t)),n}function w(e,t,n){var r=Math.min(e.length,t.length),i=Math.abs(e.length-t.length),s=0,o;for(o=0;o<r;o++)(n&&e[o]!==t[o]||!n&&b(e[o])!==b(t[o]))&&s++;return s+i}function E(){}function T(e){return e?e.toLowerCase().replace("_","-"):e}function N(e){var t=0,n,r,i,s;while(t<e.length){s=T(e[t]).split("-"),n=s.length,r=T(e[t+1]),r=r?r.split("-"):null;while(n>0){i=C(s.slice(0,n).join("-"));if(i)return i;if(r&&r.length>=n&&w(s,r,!0)>=n-1)break;n--}t++}return null}function C(e){var t=null;if(!S[e]&&typeof module!="undefined"&&module&&module.exports)try{t=x._abbr,require("./locale/"+e),k(t)}catch(n){}return S[e]}function k(e,t){var n;return e&&(typeof t=="undefined"?n=A(e):n=L(e,t),n&&(x=n)),x._abbr}function L(e,t){return t!==null?(t.abbr=e,S[e]=S[e]||new E,S[e].set(t),k(e),S[e]):(delete S[e],null)}function A(e){var t;e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr);if(!e)return x;if(!r(e)){t=C(e);if(t)return t;e=[e]}return N(e)}function M(e,t){var n=e.toLowerCase();O[n]=O[n+"s"]=O[t]=e}function _(e){return typeof e=="string"?O[e]||O[e.toLowerCase()]:undefined}function D(e){var t={},n,r;for(r in e)o(e,r)&&(n=_(r),n&&(t[n]=e[r]));return t}function P(e,n){return function(r){return r!=null?(B(this,e,r),t.updateOffset(this,n),this):H(this,e)}}function H(e,t){return e._d["get"+(e._isUTC?"UTC":"")+t]()}function B(e,t,n){return e._d["set"+(e._isUTC?"UTC":"")+t](n)}function j(e,t){var n;if(typeof e=="object")for(n in e)this.set(n,e[n]);else{e=_(e);if(typeof this[e]=="function")return this[e](t)}return this}function F(e,t,n){var r=""+Math.abs(e),i=t-r.length,s=e>=0;return(s?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+r}function z(e,t,n,r){var i=r;typeof r=="string"&&(i=function(){return this[r]()}),e&&(U[e]=i),t&&(U[t[0]]=function(){return F(i.apply(this,arguments),t[1],t[2])}),n&&(U[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function W(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function X(e){var t=e.match(I),n,r;for(n=0,r=t.length;n<r;n++)U[t[n]]?t[n]=U[t[n]]:t[n]=W(t[n]);return function(i){var s="";for(n=0;n<r;n++)s+=t[n]instanceof Function?t[n].call(i,e):t[n];return s}}function V(e,t){return e.isValid()?(t=$(t,e.localeData()),R[t]=R[t]||X(t),R[t](e)):e.localeData().invalidDate()}function $(e,t){function r(e){return t.longDateFormat(e)||e}var n=5;q.lastIndex=0;while(n>=0&&q.test(e))e=e.replace(q,r),q.lastIndex=0,n-=1;return e}function ft(e){return typeof e=="function"&&Object.prototype.toString.call(e)==="[object Function]"}function lt(e,t,n){at[e]=ft(t)?t:function(e){return e&&n?n:t}}function ct(e,t){return o(at,e)?at[e](t._strict,t._locale):new RegExp(ht(e))}function ht(e){return e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,r,i){return t||n||r||i}).replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function dt(e,t){var n,r=t;typeof e=="string"&&(e=[e]),typeof t=="number"&&(r=function(e,n){n[t]=b(e)});for(n=0;n<e.length;n++)pt[e[n]]=r}function vt(e,t){dt(e,function(e,n,r,i){r._w=r._w||{},t(e,r._w,r,i)})}function mt(e,t,n){t!=null&&o(pt,e)&&pt[e](t,n._a,n,e)}function Tt(e,t){return(new Date(Date.UTC(e,t+1,0))).getUTCDate()}function Ct(e){return this._months[e.month()]}function Lt(e){return this._monthsShort[e.month()]}function At(e,t,n){var r,i,s;this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]);for(r=0;r<12;r++){i=a([2e3,r]),n&&!this._longMonthsParse[r]&&(this._longMonthsParse[r]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[r]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),!n&&!this._monthsParse[r]&&(s="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[r]=new RegExp(s.replace(".",""),"i"));if(n&&t==="MMMM"&&this._longMonthsParse[r].test(e))return r;if(n&&t==="MMM"&&this._shortMonthsParse[r].test(e))return r;if(!n&&this._monthsParse[r].test(e))return r}}function Ot(e,t){var n;if(typeof t=="string"){t=e.localeData().monthsParse(t);if(typeof t!="number")return e}return n=Math.min(e.date(),Tt(e.year(),t)),e._d["set"+(e._isUTC?"UTC":"")+"Month"](t,n),e}function Mt(e){return e!=null?(Ot(this,e),t.updateOffset(this,!0),this):H(this,"Month")}function _t(){return Tt(this.year(),this.month())}function Dt(e){var t,n=e._a;return n&&l(e).overflow===-2&&(t=n[yt]<0||n[yt]>11?yt:n[bt]<1||n[bt]>Tt(n[gt],n[yt])?bt:n[wt]<0||n[wt]>24||n[wt]===24&&(n[Et]!==0||n[St]!==0||n[xt]!==0)?wt:n[Et]<0||n[Et]>59?Et:n[St]<0||n[St]>59?St:n[xt]<0||n[xt]>999?xt:-1,l(e)._overflowDayOfYear&&(t<gt||t>bt)&&(t=bt),l(e).overflow=t),e}function Pt(e){t.suppressDeprecationWarnings===!1&&typeof console!="undefined"&&console.warn&&console.warn("Deprecation warning: "+e)}function Ht(e,t){var n=!0;return u(function(){return n&&(Pt(e+"\n"+(new Error).stack),n=!1),t.apply(this,arguments)},t)}function jt(e,t){Bt[e]||(Pt(t),Bt[e]=!0)}function Ut(e){var t,n,r=e._i,i=Ft.exec(r);if(i){l(e).iso=!0;for(t=0,n=It.length;t<n;t++)if(It[t][1].exec(r)){e._f=It[t][0];break}for(t=0,n=qt.length;t<n;t++)if(qt[t][1].exec(r)){e._f+=(i[6]||" ")+qt[t][0];break}r.match(st)&&(e._f+="Z"),ln(e)}else e._isValid=!1}function zt(e){var n=Rt.exec(e._i);if(n!==null){e._d=new Date(+n[1]);return}Ut(e),e._isValid===!1&&(delete e._isValid,t.createFromInputFallback(e))}function Wt(e,t,n,r,i,s,o){var u=new Date(e,t,n,r,i,s,o);return e<1970&&u.setFullYear(e),u}function Xt(e){var t=new Date(Date.UTC.apply(null,arguments));return e<1970&&t.setUTCFullYear(e),t}function Vt(e){return $t(e)?366:365}function $t(e){return e%4===0&&e%100!==0||e%400===0}function Kt(){return $t(this.year())}function Qt(e,t,n){var r=n-t,i=n-e.day(),s;return i>r&&(i-=7),i<r-7&&(i+=7),s=yn(e).add(i,"d"),{week:Math.ceil(s.dayOfYear()/7),year:s.year()}}function Gt(e){return Qt(e,this._week.dow,this._week.doy).week}function Zt(){return this._week.dow}function en(){return this._week.doy}function tn(e){var t=this.localeData().week(this);return e==null?t:this.add((e-t)*7,"d")}function nn(e){var t=Qt(this,1,4).week;return e==null?t:this.add((e-t)*7,"d")}function rn(e,t,n,r,i){var s=6+i-r,o=Xt(e,0,1+s),u=o.getUTCDay(),a;return u<i&&(u+=7),n=n!=null?1*n:i,a=1+s+7*(t-1)-u+n,{year:a>0?e:e-1,dayOfYear:a>0?a:Vt(e-1)+a}}function sn(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return e==null?t:this.add(e-t,"d")}function on(e,t,n){return e!=null?e:t!=null?t:n}function un(e){var t=new Date;return e._useUTC?[t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate()]:[t.getFullYear(),t.getMonth(),t.getDate()]}function an(e){var t,n,r=[],i,s;if(e._d)return;i=un(e),e._w&&e._a[bt]==null&&e._a[yt]==null&&fn(e),e._dayOfYear&&(s=on(e._a[gt],i[gt]),e._dayOfYear>Vt(s)&&(l(e)._overflowDayOfYear=!0),n=Xt(s,0,e._dayOfYear),e._a[yt]=n.getUTCMonth(),e._a[bt]=n.getUTCDate());for(t=0;t<3&&e._a[t]==null;++t)e._a[t]=r[t]=i[t];for(;t<7;t++)e._a[t]=r[t]=e._a[t]==null?t===2?1:0:e._a[t];e._a[wt]===24&&e._a[Et]===0&&e._a[St]===0&&e._a[xt]===0&&(e._nextDay=!0,e._a[wt]=0),e._d=(e._useUTC?Xt:Wt).apply(null,r),e._tzm!=null&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[wt]=24)}function fn(e){var t,n,r,i,s,o,u;t=e._w,t.GG!=null||t.W!=null||t.E!=null?(s=1,o=4,n=on(t.GG,e._a[gt],Qt(yn(),1,4).year),r=on(t.W,1),i=on(t.E,1)):(s=e._locale._week.dow,o=e._locale._week.doy,n=on(t.gg,e._a[gt],Qt(yn(),s,o).year),r=on(t.w,1),t.d!=null?(i=t.d,i<s&&++r):t.e!=null?i=t.e+s:i=s),u=rn(n,r,i,o,s),e._a[gt]=u.year,e._dayOfYear=u.dayOfYear}function ln(e){if(e._f===t.ISO_8601){Ut(e);return}e._a=[],l(e).empty=!0;var n=""+e._i,r,i,s,o,u,a=n.length,f=0;s=$(e._f,e._locale).match(I)||[];for(r=0;r<s.length;r++)o=s[r],i=(n.match(ct(o,e))||[])[0],i&&(u=n.substr(0,n.indexOf(i)),u.length>0&&l(e).unusedInput.push(u),n=n.slice(n.indexOf(i)+i.length),f+=i.length),U[o]?(i?l(e).empty=!1:l(e).unusedTokens.push(o),mt(o,i,e)):e._strict&&!i&&l(e).unusedTokens.push(o);l(e).charsLeftOver=a-f,n.length>0&&l(e).unusedInput.push(n),l(e).bigHour===!0&&e._a[wt]<=12&&e._a[wt]>0&&(l(e).bigHour=undefined),e._a[wt]=cn(e._locale,e._a[wt],e._meridiem),an(e),Dt(e)}function cn(e,t,n){var r;return n==null?t:e.meridiemHour!=null?e.meridiemHour(t,n):e.isPM!=null?(r=e.isPM(n),r&&t<12&&(t+=12),!r&&t===12&&(t=0),t):t}function hn(e){var t,n,r,i,s;if(e._f.length===0){l(e).invalidFormat=!0,e._d=new Date(NaN);return}for(i=0;i<e._f.length;i++){s=0,t=d({},e),e._useUTC!=null&&(t._useUTC=e._useUTC),t._f=e._f[i],ln(t);if(!c(t))continue;s+=l(t).charsLeftOver,s+=l(t).unusedTokens.length*10,l(t).score=s;if(r==null||s<r)r=s,n=t}u(e,n||t)}function pn(e){if(e._d)return;var t=D(e._i);e._a=[t.year,t.month,t.day||t.date,t.hour,t.minute,t.second,t.millisecond],an(e)}function dn(e){var t=new m(Dt(vn(e)));return t._nextDay&&(t.add(1,"d"),t._nextDay=undefined),t}function vn(e){var t=e._i,n=e._f;return e._locale=e._locale||A(e._l),t===null||n===undefined&&t===""?h({nullInput:!0}):(typeof t=="string"&&(e._i=t=e._locale.preparse(t)),g(t)?new m(Dt(t)):(r(n)?hn(e):n?ln(e):i(t)?e._d=t:mn(e),e))}function mn(e){var n=e._i;n===undefined?e._d=new Date:i(n)?e._d=new Date(+n):typeof n=="string"?zt(e):r(n)?(e._a=s(n.slice(0),function(e){return parseInt(e,10)}),an(e)):typeof n=="object"?pn(e):typeof n=="number"?e._d=new Date(n):t.createFromInputFallback(e)}function gn(e,t,n,r,i){var s={};return typeof n=="boolean"&&(r=n,n=undefined),s._isAMomentObject=!0,s._useUTC=s._isUTC=i,s._l=n,s._i=e,s._f=t,s._strict=r,dn(s)}function yn(e,t,n,r){return gn(e,t,n,r,!1)}function En(e,t){var n,i;t.length===1&&r(t[0])&&(t=t[0]);if(!t.length)return yn();n=t[0];for(i=1;i<t.length;++i)if(!t[i].isValid()||t[i][e](n))n=t[i];return n}function Sn(){var e=[].slice.call(arguments,0);return En("isBefore",e)}function xn(){var e=[].slice.call(arguments,0);return En("isAfter",e)}function Tn(e){var t=D(e),n=t.year||0,r=t.quarter||0,i=t.month||0,s=t.week||0,o=t.day||0,u=t.hour||0,a=t.minute||0,f=t.second||0,l=t.millisecond||0;this._milliseconds=+l+f*1e3+a*6e4+u*36e5,this._days=+o+s*7,this._months=+i+r*3+n*12,this._data={},this._locale=A(),this._bubble()}function Nn(e){return e instanceof Tn}function Cn(e,t){z(e,0,0,function(){var e=this.utcOffset(),n="+";return e<0&&(e=-e,n="-"),n+F(~~(e/60),2)+t+F(~~e%60,2)})}function Ln(e){var t=(e||"").match(st)||[],n=t[t.length-1]||[],r=(n+"").match(kn)||["-",0,0],i=+(r[1]*60)+b(r[2]);return r[0]==="+"?i:-i}function An(e,n){var r,s;return n._isUTC?(r=n.clone(),s=(g(e)||i(e)?+e:+yn(e))- +r,r._d.setTime(+r._d+s),t.updateOffset(r,!1),r):yn(e).local()}function On(e){return-Math.round(e._d.getTimezoneOffset()/15)*15}function Mn(e,n){var r=this._offset||0,i;return e!=null?(typeof e=="string"&&(e=Ln(e)),Math.abs(e)<16&&(e*=60),!this._isUTC&&n&&(i=On(this)),this._offset=e,this._isUTC=!0,i!=null&&this.add(i,"m"),r!==e&&(!n||this._changeInProgress?Kn(this,Wn(e-r,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,t.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?r:On(this)}function _n(e,t){return e!=null?(typeof e!="string"&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}function Dn(e){return this.utcOffset(0,e)}function Pn(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(On(this),"m")),this}function Hn(){return this._tzm?this.utcOffset(this._tzm):typeof this._i=="string"&&this.utcOffset(Ln(this._i)),this}function Bn(e){return e=e?yn(e).utcOffset():0,(this.utcOffset()-e)%60===0}function jn(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Fn(){if(typeof this._isDSTShifted!="undefined")return this._isDSTShifted;var e={};d(e,this),e=vn(e);if(e._a){var t=e._isUTC?a(e._a):yn(e._a);this._isDSTShifted=this.isValid()&&w(e._a,t.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function In(){return!this._isUTC}function qn(){return this._isUTC}function Rn(){return this._isUTC&&this._offset===0}function Wn(e,t){var n=e,r=null,i,s,u;return Nn(e)?n={ms:e._milliseconds,d:e._days,M:e._months}:typeof e=="number"?(n={},t?n[t]=e:n.milliseconds=e):(r=Un.exec(e))?(i=r[1]==="-"?-1:1,n={y:0,d:b(r[bt])*i,h:b(r[wt])*i,m:b(r[Et])*i,s:b(r[St])*i,ms:b(r[xt])*i}):(r=zn.exec(e))?(i=r[1]==="-"?-1:1,n={y:Xn(r[2],i),M:Xn(r[3],i),d:Xn(r[4],i),h:Xn(r[5],i),m:Xn(r[6],i),s:Xn(r[7],i),w:Xn(r[8],i)}):n==null?n={}:typeof n=="object"&&("from"in n||"to"in n)&&(u=$n(yn(n.from),yn(n.to)),n={},n.ms=u.milliseconds,n.M=u.months),s=new Tn(n),Nn(e)&&o(e,"_locale")&&(s._locale=e._locale),s}function Xn(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)?0:n)*t}function Vn(e,t){var n={milliseconds:0,months:0};return n.months=t.month()-e.month()+(t.year()-e.year())*12,e.clone().add(n.months,"M").isAfter(t)&&--n.months,n.milliseconds=+t- +e.clone().add(n.months,"M"),n}function $n(e,t){var n;return t=An(t,e),e.isBefore(t)?n=Vn(e,t):(n=Vn(t,e),n.milliseconds=-n.milliseconds,n.months=-n.months),n}function Jn(e,t){return function(n,r){var i,s;return r!==null&&!isNaN(+r)&&(jt(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period)."),s=n,n=r,r=s),n=typeof n=="string"?+n:n,i=Wn(n,r),Kn(this,i,e),this}}function Kn(e,n,r,i){var s=n._milliseconds,o=n._days,u=n._months;i=i==null?!0:i,s&&e._d.setTime(+e._d+s*r),o&&B(e,"Date",H(e,"Date")+o*r),u&&Ot(e,H(e,"Month")+u*r),i&&t.updateOffset(e,o||u)}function Yn(e,t){var n=e||yn(),r=An(n,this).startOf("day"),i=this.diff(r,"days",!0),s=i<-6?"sameElse":i<-1?"lastWeek":i<0?"lastDay":i<1?"sameDay":i<2?"nextDay":i<7?"nextWeek":"sameElse";return this.format(t&&t[s]||this.localeData().calendar(s,this,yn(n)))}function Zn(){return new m(this)}function er(e,t){var n;return t=_(typeof t!="undefined"?t:"millisecond"),t==="millisecond"?(e=g(e)?e:yn(e),+this>+e):(n=g(e)?+e:+yn(e),n<+this.clone().startOf(t))}function tr(e,t){var n;return t=_(typeof t!="undefined"?t:"millisecond"),t==="millisecond"?(e=g(e)?e:yn(e),+this<+e):(n=g(e)?+e:+yn(e),+this.clone().endOf(t)<n)}function nr(e,t,n){return this.isAfter(e,n)&&this.isBefore(t,n)}function rr(e,t){var n;return t=_(t||"millisecond"),t==="millisecond"?(e=g(e)?e:yn(e),+this===+e):(n=+yn(e),+this.clone().startOf(t)<=n&&n<=+this.clone().endOf(t))}function ir(e,t,n){var r=An(e,this),i=(r.utcOffset()-this.utcOffset())*6e4,s,o;return t=_(t),t==="year"||t==="month"||t==="quarter"?(o=sr(this,r),t==="quarter"?o/=3:t==="year"&&(o/=12)):(s=this-r,o=t==="second"?s/1e3:t==="minute"?s/6e4:t==="hour"?s/36e5:t==="day"?(s-i)/864e5:t==="week"?(s-i)/6048e5:s),n?o:y(o)}function sr(e,t){var n=(t.year()-e.year())*12+(t.month()-e.month()),r=e.clone().add(n,"months"),i,s;return t-r<0?(i=e.clone().add(n-1,"months"),s=(t-r)/(r-i)):(i=e.clone().add(n+1,"months"),s=(t-r)/(i-r)),-(n+s)}function or(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function ur(){var e=this.clone().utc();return 0<e.year()&&e.year()<=9999?"function"==typeof Date.prototype.toISOString?this.toDate().toISOString():V(e,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):V(e,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function ar(e){var n=V(this,e||t.defaultFormat);return this.localeData().postformat(n)}function fr(e,t){return this.isValid()?Wn({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function lr(e){return this.from(yn(),e)}function cr(e,t){return this.isValid()?Wn({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function hr(e){return this.to(yn(),e)}function pr(e){var t;return e===undefined?this._locale._abbr:(t=A(e),t!=null&&(this._locale=t),this)}function vr(){return this._locale}function mr(e){e=_(e);switch(e){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return e==="week"&&this.weekday(0),e==="isoWeek"&&this.isoWeekday(1),e==="quarter"&&this.month(Math.floor(this.month()/3)*3),this}function gr(e){return e=_(e),e===undefined||e==="millisecond"?this:this.startOf(e).add(1,e==="isoWeek"?"week":e).subtract(1,"ms")}function yr(){return+this._d-(this._offset||0)*6e4}function br(){return Math.floor(+this/1e3)}function wr(){return this._offset?new Date(+this):this._d}function Er(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function Sr(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function xr(){return c(this)}function Tr(){return u({},l(this))}function Nr(){return l(this).overflow}function Cr(e,t){z(0,[e,e.length],0,t)}function kr(e,t,n){return Qt(yn([e,11,31+t-n]),t,n).week}function Lr(e){var t=Qt(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return e==null?t:this.add(e-t,"y")}function Ar(e){var t=Qt(this,1,4).year;return e==null?t:this.add(e-t,"y")}function Or(){return kr(this.year(),1,4)}function Mr(){var e=this.localeData()._week;return kr(this.year(),e.dow,e.doy)}function _r(e){return e==null?Math.ceil((this.month()+1)/3):this.month((e-1)*3+this.month()%3)}function Pr(e,t){return typeof e!="string"?e:isNaN(e)?(e=t.weekdaysParse(e),typeof e=="number"?e:null):parseInt(e,10)}function Br(e){return this._weekdays[e.day()]}function Fr(e){return this._weekdaysShort[e.day()]}function qr(e){return this._weekdaysMin[e.day()]}function Rr(e){var t,n,r;this._weekdaysParse=this._weekdaysParse||[];for(t=0;t<7;t++){this._weekdaysParse[t]||(n=yn([2e3,1]).day(t),r="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,""),this._weekdaysParse[t]=new RegExp(r.replace(".",""),"i"));if(this._weekdaysParse[t].test(e))return t}}function Ur(e){var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return e!=null?(e=Pr(e,this.localeData()),this.add(e-t,"d")):t}function zr(e){var t=(this.day()+7-this.localeData()._week.dow)%7;return e==null?t:this.add(e-t,"d")}function Wr(e){return e==null?this.day()||7:this.day(this.day()%7?e:e-7)}function Xr(e,t){z(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function Vr(e,t){return t._meridiemParse}function $r(e){return(e+"").toLowerCase().charAt(0)==="p"}function Kr(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"}function ei(e,t){t[xt]=b(("0."+e)*1e3)}function ni(){return this._isUTC?"UTC":""}function ri(){return this._isUTC?"Coordinated Universal Time":""}function oi(e){return yn(e*1e3)}function ui(){return yn.apply(null,arguments).parseZone()}function fi(e,t,n){var r=this._calendar[e];return typeof r=="function"?r.call(t,n):r}function ci(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.replace(/MMMM|MM|DD|dddd/g,function(e){return e.slice(1)}),this._longDateFormat[e])}function pi(){return this._invalidDate}function mi(e){return this._ordinal.replace("%d",e)}function gi(e){return e}function bi(e,t,n,r){var i=this._relativeTime[n];return typeof i=="function"?i(e,t,n,r):i.replace(/%d/i,e)}function wi(e,t){var n=this._relativeTime[e>0?"future":"past"];return typeof n=="function"?n(t):n.replace(/%s/i,t)}function Ei(e){var t,n;for(n in e)t=e[n],typeof t=="function"?this[n]=t:this["_"+n]=t;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function xi(e,t,n,r){var i=A(),s=a().set(r,t);return i[n](s,e)}function Ti(e,t,n,r,i){typeof e=="number"&&(t=e,e=undefined),e=e||"";if(t!=null)return xi(e,t,n,i);var s,o=[];for(s=0;s<r;s++)o[s]=xi(e,s,n,i);return o}function Ni(e,t){return Ti(e,t,"months",12,"month")}function Ci(e,t){return Ti(e,t,"monthsShort",12,"month")}function ki(e,t){return Ti(e,t,"weekdays",7,"day")}function Li(e,t){return Ti(e,t,"weekdaysShort",7,"day")}function Ai(e,t){return Ti(e,t,"weekdaysMin",7,"day")}function Mi(){var e=this._data;return this._milliseconds=Oi(this._milliseconds),this._days=Oi(this._days),this._months=Oi(this._months),e.milliseconds=Oi(e.milliseconds),e.seconds=Oi(e.seconds),e.minutes=Oi(e.minutes),e.hours=Oi(e.hours),e.months=Oi(e.months),e.years=Oi(e.years),this}function _i(e,t,n,r){var i=Wn(t,n);return e._milliseconds+=r*i._milliseconds,e._days+=r*i._days,e._months+=r*i._months,e._bubble()}function Di(e,t){return _i(this,e,t,1)}function Pi(e,t){return _i(this,e,t,-1)}function Hi(e){return e<0?Math.floor(e):Math.ceil(e)}function Bi(){var e=this._milliseconds,t=this._days,n=this._months,r=this._data,i,s,o,u,a;return e>=0&&t>=0&&n>=0||e<=0&&t<=0&&n<=0||(e+=Hi(Fi(n)+t)*864e5,t=0,n=0),r.milliseconds=e%1e3,i=y(e/1e3),r.seconds=i%60,s=y(i/60),r.minutes=s%60,o=y(s/60),r.hours=o%24,t+=y(o/24),a=y(ji(t)),n+=a,t-=Hi(Fi(a)),u=y(n/12),n%=12,r.days=t,r.months=n,r.years=u,this}function ji(e){return e*4800/146097}function Fi(e){return e*146097/4800}function Ii(e){var t,n,r=this._milliseconds;e=_(e);if(e==="month"||e==="year")return t=this._days+r/864e5,n=this._months+ji(t),e==="month"?n:n/12;t=this._days+Math.round(Fi(this._months));switch(e){case"week":return t/7+r/6048e5;case"day":return t+r/864e5;case"hour":return t*24+r/36e5;case"minute":return t*1440+r/6e4;case"second":return t*86400+r/1e3;case"millisecond":return Math.floor(t*864e5)+r;default:throw new Error("Unknown unit "+e)}}function qi(){return this._milliseconds+this._days*864e5+this._months%12*2592e6+b(this._months/12)*31536e6}function Ri(e){return function(){return this.as(e)}}function Qi(e){return e=_(e),this[e+"s"]()}function Gi(e){return function(){return this._data[e]}}function ss(){return y(this.days()/7)}function as(e,t,n,r,i){return i.relativeTime(t||1,!!n,e,r)}function fs(e,t,n){var r=Wn(e).abs(),i=os(r.as("s")),s=os(r.as("m")),o=os(r.as("h")),u=os(r.as("d")),a=os(r.as("M")),f=os(r.as("y")),l=i<us.s&&["s",i]||s===1&&["m"]||s<us.m&&["mm",s]||o===1&&["h"]||o<us.h&&["hh",o]||u===1&&["d"]||u<us.d&&["dd",u]||a===1&&["M"]||a<us.M&&["MM",a]||f===1&&["y"]||["yy",f];return l[2]=t,l[3]=+e>0,l[4]=n,as.apply(null,l)}function ls(e,t){return us[e]===undefined?!1:t===undefined?us[e]:(us[e]=t,!0)}function cs(e){var t=this.localeData(),n=fs(this,!e,t);return e&&(n=t.pastFuture(+this,n)),t.postformat(n)}function ps(){var e=hs(this._milliseconds)/1e3,t=hs(this._days),n=hs(this._months),r,i,s;r=y(e/60),i=y(r/60),e%=60,r%=60,s=y(n/12),n%=12;var o=s,u=n,a=t,f=i,l=r,c=e,h=this.asSeconds();return h?(h<0?"-":"")+"P"+(o?o+"Y":"")+(u?u+"M":"")+(a?a+"D":"")+(f||l||c?"T":"")+(f?f+"H":"")+(l?l+"M":"")+(c?c+"S":""):"P0D"}var e,p=t.momentProperties=[],v=!1,S={},x,O={},I=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,q=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,R={},U={},J=/\d/,K=/\d\d/,Q=/\d{3}/,G=/\d{4}/,Y=/[+-]?\d{6}/,Z=/\d\d?/,et=/\d{1,3}/,tt=/\d{1,4}/,nt=/[+-]?\d{1,6}/,rt=/\d+/,it=/[+-]?\d+/,st=/Z|[+-]\d\d:?\d\d/gi,ot=/[+-]?\d+(\.\d{1,3})?/,ut=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,at={},pt={},gt=0,yt=1,bt=2,wt=3,Et=4,St=5,xt=6;z("M",["MM",2],"Mo",function(){return this.month()+1}),z("MMM",0,0,function(e){return this.localeData().monthsShort(this,e)}),z("MMMM",0,0,function(e){return this.localeData().months(this,e)}),M("month","M"),lt("M",Z),lt("MM",Z,K),lt("MMM",ut),lt("MMMM",ut),dt(["M","MM"],function(e,t){t[yt]=b(e)-1}),dt(["MMM","MMMM"],function(e,t,n,r){var i=n._locale.monthsParse(e,r,n._strict);i!=null?t[yt]=i:l(n).invalidMonth=e});var Nt="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),kt="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),Bt={};t.suppressDeprecationWarnings=!1;var Ft=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,It=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],qt=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],Rt=/^\/?Date\((\-?\d+)/i;t.createFromInputFallback=Ht("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(e){e._d=new Date(e._i+(e._useUTC?" UTC":""))}),z(0,["YY",2],0,function(){return this.year()%100}),z(0,["YYYY",4],0,"year"),z(0,["YYYYY",5],0,"year"),z(0,["YYYYYY",6,!0],0,"year"),M("year","y"),lt("Y",it),lt("YY",Z,K),lt("YYYY",tt,G),lt("YYYYY",nt,Y),lt("YYYYYY",nt,Y),dt(["YYYYY","YYYYYY"],gt),dt("YYYY",function(e,n){n[gt]=e.length===2?t.parseTwoDigitYear(e):b(e)}),dt("YY",function(e,n){n[gt]=t.parseTwoDigitYear(e)}),t.parseTwoDigitYear=function(e){return b(e)+(b(e)>68?1900:2e3)};var Jt=P("FullYear",!1);z("w",["ww",2],"wo","week"),z("W",["WW",2],"Wo","isoWeek"),M("week","w"),M("isoWeek","W"),lt("w",Z),lt("ww",Z,K),lt("W",Z),lt("WW",Z,K),vt(["w","ww","W","WW"],function(e,t,n,r){t[r.substr(0,1)]=b(e)});var Yt={dow:0,doy:6};z("DDD",["DDDD",3],"DDDo","dayOfYear"),M("dayOfYear","DDD"),lt("DDD",et),lt("DDDD",Q),dt(["DDD","DDDD"],function(e,t,n){n._dayOfYear=b(e)}),t.ISO_8601=function(){};var bn=Ht("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(){var e=yn.apply(null,arguments);return e<this?this:e}),wn=Ht("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(){var e=yn.apply(null,arguments);return e>this?this:e});Cn("Z",":"),Cn("ZZ",""),lt("Z",st),lt("ZZ",st),dt(["Z","ZZ"],function(e,t,n){n._useUTC=!0,n._tzm=Ln(e)});var kn=/([\+\-]|\d\d)/gi;t.updateOffset=function(){};var Un=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,zn=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/;Wn.fn=Tn.prototype;var Qn=Jn(1,"add"),Gn=Jn(-1,"subtract");t.defaultFormat="YYYY-MM-DDTHH:mm:ssZ";var dr=Ht("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return e===undefined?this.localeData():this.locale(e)});z(0,["gg",2],0,function(){return this.weekYear()%100}),z(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Cr("gggg","weekYear"),Cr("ggggg","weekYear"),Cr("GGGG","isoWeekYear"),Cr("GGGGG","isoWeekYear"),M("weekYear","gg"),M("isoWeekYear","GG"),lt("G",it),lt("g",it),lt("GG",Z,K),lt("gg",Z,K),lt("GGGG",tt,G),lt("gggg",tt,G),lt("GGGGG",nt,Y),lt("ggggg",nt,Y),vt(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,r){t[r.substr(0,2)]=b(e)}),vt(["gg","GG"],function(e,n,r,i){n[i]=t.parseTwoDigitYear(e)}),z("Q",0,0,"quarter"),M("quarter","Q"),lt("Q",J),dt("Q",function(e,t){t[yt]=(b(e)-1)*3}),z("D",["DD",2],"Do","date"),M("date","D"),lt("D",Z),lt("DD",Z,K),lt("Do",function(e,t){return e?t._ordinalParse:t._ordinalParseLenient}),dt(["D","DD"],bt),dt("Do",function(e,t){t[bt]=b(e.match(Z)[0],10)});var Dr=P("Date",!0);z("d",0,"do","day"),z("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),z("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),z("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),z("e",0,0,"weekday"),z("E",0,0,"isoWeekday"),M("day","d"),M("weekday","e"),M("isoWeekday","E"),lt("d",Z),lt("e",Z),lt("E",Z),lt("dd",ut),lt("ddd",ut),lt("dddd",ut),vt(["dd","ddd","dddd"],function(e,t,n){var r=n._locale.weekdaysParse(e);r!=null?t.d=r:l(n).invalidWeekday=e}),vt(["d","e","E"],function(e,t,n,r){t[r]=b(e)});var Hr="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),jr="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Ir="Su_Mo_Tu_We_Th_Fr_Sa".split("_");z("H",["HH",2],0,"hour"),z("h",["hh",2],0,function(){return this.hours()%12||12}),Xr("a",!0),Xr("A",!1),M("hour","h"),lt("a",Vr),lt("A",Vr),lt("H",Z),lt("h",Z),lt("HH",Z,K),lt("hh",Z,K),dt(["H","HH"],wt),dt(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),dt(["h","hh"],function(e,t,n){t[wt]=b(e),l(n).bigHour=!0});var Jr=/[ap]\.?m?\.?/i,Qr=P("Hours",!0);z("m",["mm",2],0,"minute"),M("minute","m"),lt("m",Z),lt("mm",Z,K),dt(["m","mm"],Et);var Gr=P("Minutes",!1);z("s",["ss",2],0,"second"),M("second","s"),lt("s",Z),lt("ss",Z,K),dt(["s","ss"],St);var Yr=P("Seconds",!1);z("S",0,0,function(){return~~(this.millisecond()/100)}),z(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),z(0,["SSS",3],0,"millisecond"),z(0,["SSSS",4],0,function(){return this.millisecond()*10}),z(0,["SSSSS",5],0,function(){return this.millisecond()*100}),z(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3}),z(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4}),z(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5}),z(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6}),M("millisecond","ms"),lt("S",et,J),lt("SS",et,K),lt("SSS",et,Q);var Zr;for(Zr="SSSS";Zr.length<=9;Zr+="S")lt(Zr,rt);for(Zr="S";Zr.length<=9;Zr+="S")dt(Zr,ei);var ti=P("Milliseconds",!1);z("z",0,0,"zoneAbbr"),z("zz",0,0,"zoneName");var ii=m.prototype;ii.add=Qn,ii.calendar=Yn,ii.clone=Zn,ii.diff=ir,ii.endOf=gr,ii.format=ar,ii.from=fr,ii.fromNow=lr,ii.to=cr,ii.toNow=hr,ii.get=j,ii.invalidAt=Nr,ii.isAfter=er,ii.isBefore=tr,ii.isBetween=nr,ii.isSame=rr,ii.isValid=xr,ii.lang=dr,ii.locale=pr,ii.localeData=vr,ii.max=wn,ii.min=bn,ii.parsingFlags=Tr,ii.set=j,ii.startOf=mr,ii.subtract=Gn,ii.toArray=Er,ii.toObject=Sr,ii.toDate=wr,ii.toISOString=ur,ii.toJSON=ur,ii.toString=or,ii.unix=br,ii.valueOf=yr,ii.year=Jt,ii.isLeapYear=Kt,ii.weekYear=Lr,ii.isoWeekYear=Ar,ii.quarter=ii.quarters=_r,ii.month=Mt,ii.daysInMonth=_t,ii.week=ii.weeks=tn,ii.isoWeek=ii.isoWeeks=nn,ii.weeksInYear=Mr,ii.isoWeeksInYear=Or,ii.date=Dr,ii.day=ii.days=Ur,ii.weekday=zr,ii.isoWeekday=Wr,ii.dayOfYear=sn,ii.hour=ii.hours=Qr,ii.minute=ii.minutes=Gr,ii.second=ii.seconds=Yr,ii.millisecond=ii.milliseconds=ti,ii.utcOffset=Mn,ii.utc=Dn,ii.local=Pn,ii.parseZone=Hn,ii.hasAlignedHourOffset=Bn,ii.isDST=jn,ii.isDSTShifted=Fn,ii.isLocal=In,ii.isUtcOffset=qn,ii.isUtc=Rn,ii.isUTC=Rn,ii.zoneAbbr=ni,ii.zoneName=ri,ii.dates=Ht("dates accessor is deprecated. Use date instead.",Dr),ii.months=Ht("months accessor is deprecated. Use month instead",Mt),ii.years=Ht("years accessor is deprecated. Use year instead",Jt),ii.zone=Ht("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",_n);var si=ii,ai={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},li={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},hi="Invalid date",di="%d",vi=/\d{1,2}/,yi={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Si=E.prototype;Si._calendar=ai,Si.calendar=fi,Si._longDateFormat=li,Si.longDateFormat=ci,Si._invalidDate=hi,Si.invalidDate=pi,Si._ordinal=di,Si.ordinal=mi,Si._ordinalParse=vi,Si.preparse=gi,Si.postformat=gi,Si._relativeTime=yi,Si.relativeTime=bi,Si.pastFuture=wi,Si.set=Ei,Si.months=Ct,Si._months=Nt,Si.monthsShort=Lt,Si._monthsShort=kt,Si.monthsParse=At,Si.week=Gt,Si._week=Yt,Si.firstDayOfYear=en,Si.firstDayOfWeek=Zt,Si.weekdays=Br,Si._weekdays=Hr,Si.weekdaysMin=qr,Si._weekdaysMin=Ir,Si.weekdaysShort=Fr,Si._weekdaysShort=jr,Si.weekdaysParse=Rr,Si.isPM=$r,Si._meridiemParse=Jr,Si.meridiem=Kr,k("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,n=b(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+n}}),t.lang=Ht("moment.lang is deprecated. Use moment.locale instead.",k),t.langData=Ht("moment.langData is deprecated. Use moment.localeData instead.",A);var Oi=Math.abs,Ui=Ri("ms"),zi=Ri("s"),Wi=Ri("m"),Xi=Ri("h"),Vi=Ri("d"),$i=Ri("w"),Ji=Ri("M"),Ki=Ri("y"),Yi=Gi("milliseconds"),Zi=Gi("seconds"),es=Gi("minutes"),ts=Gi("hours"),ns=Gi("days"),rs=Gi("months"),is=Gi("years"),os=Math.round,us={s:45,m:45,h:22,d:26,M:11},hs=Math.abs,ds=Tn.prototype;ds.abs=Mi,ds.add=Di,ds.subtract=Pi,ds.as=Ii,ds.asMilliseconds=Ui,ds.asSeconds=zi,ds.asMinutes=Wi,ds.asHours=Xi,ds.asDays=Vi,ds.asWeeks=$i,ds.asMonths=Ji,ds.asYears=Ki,ds.valueOf=qi,ds._bubble=Bi,ds.get=Qi,ds.milliseconds=Yi,ds.seconds=Zi,ds.minutes=es,ds.hours=ts,ds.days=ns,ds.weeks=ss,ds.months=rs,ds.years=is,ds.humanize=cs,ds.toISOString=ps,ds.toString=ps,ds.toJSON=ps,ds.locale=pr,ds.localeData=vr,ds.toIsoString=Ht("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ps),ds.lang=dr,z("X",0,0,"unix"),z("x",0,0,"valueOf"),lt("x",it),lt("X",ot),dt("X",function(e,t,n){n._d=new Date(parseFloat(e,10)*1e3)}),dt("x",function(e,t,n){n._d=new Date(b(e))}),t.version="2.10.6",n(yn),t.fn=si,t.min=Sn,t.max=xn,t.utc=a,t.unix=oi,t.months=Ni,t.isDate=i,t.locale=k,t.invalid=h,t.duration=Wn,t.isMoment=g,t.weekdays=ki,t.parseZone=ui,t.localeData=A,t.isDuration=Nn,t.monthsShort=Ci,t.weekdaysMin=Ai,t.defineLocale=L,t.weekdaysShort=Li,t.normalizeUnits=_,t.relativeTimeThreshold=ls;var vs=t;return vs}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_af",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(e){return/^nm$/i.test(e)},meridiem:function(e,t,n){return e<12?n?"vm":"VM":n?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(e===1||e===8||e>=20?"ste":"de")},week:{dow:1,doy:4}});return t}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_de",["moment"],t):t(e.moment)}(this,function(e){"use strict";function t(e,t,n,r){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?i[n][0]:i[n][1]}var n=e.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return n}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_es",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t="Ene._Feb._Mar._Abr._May._Jun._Jul._Ago._Sep._Oct._Nov._Dic.".split("_"),n="Ene_Feb_Mar_Abr_May_Jun_Jul_Ago_Sep_Oct_Nov_Dic".split("_"),r=e.defineLocale("es",{months:"Enero_Febrero_Marzo_Abril_Mayo_Junio_Julio_Agosto_Septiembre_Octubre_Noviembre_Diciembre".split("_"),monthsShort:function(e,r){return/-MMM-/.test(r)?n[e.month()]:t[e.month()]},weekdays:"Domingo_Lunes_Martes_Miércoles_Jueves_Viernes_Sábado".split("_"),weekdaysShort:"Dom._Lun._Mar._Mié._Jue._Vie._Sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(this.hours()!==1?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(this.hours()!==1?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(this.hours()!==1?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(this.hours()!==1?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(this.hours()!==1?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return r}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_fr",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(e){return e+(e===1?"er":"")},week:{dow:1,doy:4}});return t}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_he",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("he",{months:"ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),weekdays:"ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"א_ב_ג_ד_ה_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[היום ב־]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[אתמול ב־]LT",lastWeek:"[ביום] dddd [האחרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(e){return e===2?"שעתיים":e+" שעות"},d:"יום",dd:function(e){return e===2?"יומיים":e+" ימים"},M:"חודש",MM:function(e){return e===2?"חודשיים":e+" חודשים"},y:"שנה",yy:function(e){return e===2?"שנתיים":e%10===0&&e!==10?e+" שנה":e+" שנים"}}});return t}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_hu",["moment"],t):t(e.moment)}(this,function(e){"use strict";function n(e,t,n,r){var i=e,s;switch(n){case"s":return r||t?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(r||t?" perc":" perce");case"mm":return i+(r||t?" perc":" perce");case"h":return"egy"+(r||t?" óra":" órája");case"hh":return i+(r||t?" óra":" órája");case"d":return"egy"+(r||t?" nap":" napja");case"dd":return i+(r||t?" nap":" napja");case"M":return"egy"+(r||t?" hónap":" hónapja");case"MM":return i+(r||t?" hónap":" hónapja");case"y":return"egy"+(r||t?" év":" éve");case"yy":return i+(r||t?" év":" éve")}return""}function r(e){return(e?"":"[múlt] ")+"["+t[this.day()]+"] LT[-kor]"}var t="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" "),i=e.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(e){return e.charAt(1).toLowerCase()==="u"},meridiem:function(e,t,n){return e<12?n===!0?"de":"DE":n===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return r.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return r.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return i}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_id",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(e,t){e===12&&(e=0);if(t==="pagi")return e;if(t==="siang")return e>=11?e:e+12;if(t==="sore"||t==="malam")return e+12},meridiem:function(e,t,n){return e<11?"pagi":e<15?"siang":e<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return t}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_it",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return t}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_ja",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"Ah時m分s秒",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah時m分",LLLL:"YYYY年M月D日Ah時m分 dddd"},meridiemParse:/午前|午後/i,isPM:function(e){return e==="午後"},meridiem:function(e,t,n){return e<12?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[来週]dddd LT",lastDay:"[昨日] LT",lastWeek:"[前週]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}});return t}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_nb",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tirs_ons_tors_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"H.mm",LTS:"H.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H.mm",LLLL:"dddd D. MMMM YYYY [kl.] H.mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return t}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_nl",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),r=e.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,r){return/-MMM-/.test(r)?n[e.month()]:t[e.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(e===1||e===8||e>=20?"ste":"de")},week:{dow:1,doy:4}});return r}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_pl",["moment"],t):t(e.moment)}(this,function(e){"use strict";function r(e){return e%10<5&&e%10>1&&~~(e/10)%10!==1}function i(e,t,n){var i=e+" ";switch(n){case"m":return t?"minuta":"minutę";case"mm":return i+(r(e)?"minuty":"minut");case"h":return t?"godzina":"godzinę";case"hh":return i+(r(e)?"godziny":"godzin");case"MM":return i+(r(e)?"miesiące":"miesięcy");case"yy":return i+(r(e)?"lata":"lat")}}var t="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),n="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_"),s=e.defineLocale("pl",{months:function(e,r){return r===""?"("+n[e.month()]+"|"+t[e.month()]+")":/D MMMM/.test(r)?n[e.month()]:t[e.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"nie_pon_wt_śr_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:i,mm:i,h:i,hh:i,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:i,y:"rok",yy:i},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_pt-br",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("pt-br",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return this.day()===0||this.day()===6?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"poucos segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"});return t}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_ru",["moment"],t):t(e.moment)}(this,function(e){"use strict";function t(e,t){var n=e.split("_");return t%10===1&&t%100!==11?n[0]:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?n[1]:n[2]}function n(e,n,r){var i={mm:n?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return r==="m"?n?"минута":"минуту":e+" "+t(i[r],+e)}function r(e,t){var n={nominative:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),accusative:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_")},r=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(t)?"accusative":"nominative";return n[r][e.month()]}function i(e,t){var n={nominative:"янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),accusative:"янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек".split("_")},r=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(t)?"accusative":"nominative";return n[r][e.month()]}function s(e,t){var n={nominative:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),accusative:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_")},r=/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/.test(t)?"accusative":"nominative";return n[r][e.day()]}var o=e.defineLocale("ru",{months:r,monthsShort:i,weekdays:s,weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|я]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Сегодня в] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return this.day()===2?"[Во] dddd [в] LT":"[В] dddd [в] LT"},lastWeek:function(e){if(e.week()===this.week())return this.day()===2?"[Во] dddd [в] LT":"[В] dddd [в] LT";switch(this.day()){case 0:return"[В прошлое] dddd [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",m:n,mm:n,h:"час",hh:n,d:"день",dd:n,M:"месяц",MM:n,y:"год",yy:n},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(e){return/^(дня|вечера)$/.test(e)},meridiem:function(e,t,n){return e<4?"ночи":e<12?"утра":e<17?"дня":"вечера"},ordinalParse:/\d{1,2}-(й|го|я)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":return e+"-й";case"D":return e+"-го";case"w":case"W":return e+"-я";default:return e}},week:{dow:1,doy:7}});return o}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_uk",["moment"],t):t(e.moment)}(this,function(e){"use strict";function t(e,t){var n=e.split("_");return t%10===1&&t%100!==11?n[0]:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?n[1]:n[2]}function n(e,n,r){var i={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"};return r==="m"?n?"хвилина":"хвилину":r==="h"?n?"година":"годину":e+" "+t(i[r],+e)}function r(e,t){var n={nominative:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_"),accusative:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_")},r=/D[oD]? *MMMM?/.test(t)?"accusative":"nominative";return n[r][e.month()]}function i(e,t){var n={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")},r=/(\[[ВвУу]\]) ?dddd/.test(t)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(t)?"genitive":"nominative";return n[r][e.day()]}function s(e){return function(){return e+"о"+(this.hours()===11?"б":"")+"] LT"}}var o=e.defineLocale("uk",{months:r,monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:i,weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., HH:mm",LLLL:"dddd, D MMMM YYYY р., HH:mm"},calendar:{sameDay:s("[Сьогодні "),nextDay:s("[Завтра "),lastDay:s("[Вчора "),nextWeek:s("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return s("[Минулої] dddd [").call(this);case 1:case 2:case 4:return s("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",m:n,mm:n,h:"годину",hh:n,d:"день",dd:n,M:"місяць",MM:n,y:"рік",yy:n},meridiemParse:/ночі|ранку|дня|вечора/,isPM:function(e){return/^(дня|вечора)$/.test(e)},meridiem:function(e,t,n){return e<4?"ночі":e<12?"ранку":e<17?"дня":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return e+"-й";case"D":return e+"-го";default:return e}},week:{dow:1,doy:7}});return o}),function(e,t){typeof exports=="object"&&typeof module!="undefined"?t(require("../moment")):typeof define=="function"&&define.amd?define("moment_zh",["moment"],t):t(e.moment)}(this,function(e){"use strict";var t=e.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah点mm分",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日Ah点mm分",LLLL:"YYYY年MMMD日ddddAh点mm分",l:"YYYY-MM-DD",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日Ah点mm分",llll:"YYYY年MMMD日ddddAh点mm分"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return e===12&&(e=0),t==="凌晨"||t==="早上"||t==="上午"?e:t==="下午"||t==="晚上"?e+12:e>=11?e:e+12},meridiem:function(e,t,n){var r=e*100+t;return r<600?"凌晨":r<900?"早上":r<1130?"上午":r<1230?"中午":r<1800?"下午":"晚上"},calendar:{sameDay:function(){return this.minutes()===0?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return this.minutes()===0?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return this.minutes()===0?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var t,n;return t=e().startOf("week"),n=this.unix()-t.unix()>=604800?"[下]":"[本]",this.minutes()===0?n+"dddAh点整":n+"dddAh点mm"},lastWeek:function(){var t,n;return t=e().startOf("week"),n=this.unix()<t.unix()?"[上]":"[本]",this.minutes()===0?n+"dddAh点整":n+"dddAh点mm"},sameElse:"LL"},ordinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},week:{dow:1,doy:4}});return t}),function(e,t){define("moment_with_locales",["moment","moment_af","moment_de","moment_es","moment_fr","moment_he","moment_hu","moment_id","moment_it","moment_ja","moment_nb","moment_nl","moment_pl","moment_pt-br","moment_ru","moment_uk","moment_zh"],function(e){return e})}(this),function(e,t){typeof define=="function"&&define.amd?define("strophe-sha1",[],function(){return t()}):e.SHA1=t()}(this,function(){function e(e,r){e[r>>5]|=128<<24-r%32,e[(r+64>>9<<4)+15]=r;var o=new Array(80),u=1732584193,a=-271733879,f=-1732584194,l=271733878,c=-1009589776,h,p,d,v,m,g,y,b;for(h=0;h<e.length;h+=16){v=u,m=a,g=f,y=l,b=c;for(p=0;p<80;p++)p<16?o[p]=e[h+p]:o[p]=s(o[p-3]^o[p-8]^o[p-14]^o[p-16],1),d=i(i(s(u,5),t(p,a,f,l)),i(i(c,o[p]),n(p))),c=l,l=f,f=s(a,30),a=u,u=d;u=i(u,v),a=i(a,m),f=i(f,g),l=i(l,y),c=i(c,b)}return[u,a,f,l,c]}function t(e,t,n,r){return e<20?t&n|~t&r:e<40?t^n^r:e<60?t&n|t&r|n&r:t^n^r}function n(e){return e<20?1518500249:e<40?1859775393:e<60?-1894007588:-899497514}function r(t,n){var r=o(t);r.length>16&&(r=e(r,t.length*8));var i=new Array(16),s=new Array(16);for(var u=0;u<16;u++)i[u]=r[u]^909522486,s[u]=r[u]^1549556828;var a=e(i.concat(o(n)),512+n.length*8);return e(s.concat(a),672)}function i(e,t){var n=(e&65535)+(t&65535),r=(e>>16)+(t>>16)+(n>>16);return r<<16|n&65535}function s(e,t){return e<<t|e>>>32-t}function o(e){var t=[],n=255;for(var r=0;r<e.length*8;r+=8)t[r>>5]|=(e.charCodeAt(r/8)&n)<<24-r%32;return t}function u(e){var t="",n=255;for(var r=0;r<e.length*32;r+=8)t+=String.fromCharCode(e[r>>5]>>>24-r%32&n);return t}function a(e){var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n="",r,i;for(var s=0;s<e.length*4;s+=3){r=(e[s>>2]>>8*(3-s%4)&255)<<16|(e[s+1>>2]>>8*(3-(s+1)%4)&255)<<8|e[s+2>>2]>>8*(3-(s+2)%4)&255;for(i=0;i<4;i++)s*8+i*6>e.length*32?n+="=":n+=t.charAt(r>>6*(3-i)&63)}return n}return{b64_hmac_sha1:function(e,t){return a(r(e,t))},b64_sha1:function(t){return a(e(o(t),t.length*8))},binb2str:u,core_hmac_sha1:r,str_hmac_sha1:function(e,t){return u(r(e,t))},str_sha1:function(t){return u(e(o(t),t.length*8))}}}),function(e,t){typeof define=="function"&&define.amd?define("strophe-base64",[],function(){return t()}):e.Base64=t()}(this,function(){var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",t={encode:function(t){var n="",r,i,s,o,u,a,f,l=0;do r=t.charCodeAt(l++),i=t.charCodeAt(l++),s=t.charCodeAt(l++),o=r>>2,u=(r&3)<<4|i>>4,a=(i&15)<<2|s>>6,f=s&63,isNaN(i)?(u=(r&3)<<4,a=f=64):isNaN(s)&&(f=64),n=n+e.charAt(o)+e.charAt(u)+e.charAt(a)+e.charAt(f);while(l<t.length);return n},decode:function(t){var n="",r,i,s,o,u,a,f,l=0;t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");do o=e.indexOf(t.charAt(l++)),u=e.indexOf(t.charAt(l++)),a=e.indexOf(t.charAt(l++)),f=e.indexOf(t.charAt(l++)),r=o<<2|u>>4,i=(u&15)<<4|a>>2,s=(a&3)<<6|f,n+=String.fromCharCode(r),a!=64&&(n+=String.fromCharCode(i)),f!=64&&(n+=String.fromCharCode(s));while(l<t.length);return n}};return t}),function(e,t){typeof define=="function"&&define.amd?define("strophe-md5",[],function(){return t()}):e.MD5=t()}(this,function(e){var t=function(e,t){var n=(e&65535)+(t&65535),r=(e>>16)+(t>>16)+(n>>16);return r<<16|n&65535},n=function(e,t){return e<<t|e>>>32-t},r=function(e){var t=[];for(var n=0;n<e.length*8;n+=8)t[n>>5]|=(e.charCodeAt(n/8)&255)<<n%32;return t},i=function(e){var t="";for(var n=0;n<e.length*32;n+=8)t+=String.fromCharCode(e[n>>5]>>>n%32&255);return t},s=function(e){var t="0123456789abcdef",n="";for(var r=0;r<e.length*4;r++)n+=t.charAt(e[r>>2]>>r%4*8+4&15)+t.charAt(e[r>>2]>>r%4*8&15);return n},o=function(e,r,i,s,o,u){return t(n(t(t(r,e),t(s,u)),o),i)},u=function(e,t,n,r,i,s,u){return o(t&n|~t&r,e,t,i,s,u)},a=function(e,t,n,r,i,s,u){return o(t&r|n&~r,e,t,i,s,u)},f=function(e,t,n,r,i,s,u){return o(t^n^r,e,t,i,s,u)},l=function(e,t,n,r,i,s,u){return o(n^(t|~r),e,t,i,s,u)},c=function(e,n){e[n>>5]|=128<<n%32,e[(n+64>>>9<<4)+14]=n;var r=1732584193,i=-271733879,s=-1732584194,o=271733878,c,h,p,d;for(var v=0;v<e.length;v+=16)c=r,h=i,p=s,d=o,r=u(r,i,s,o,e[v+0],7,-680876936),o=u(o,r,i,s,e[v+1],12,-389564586),s=u(s,o,r,i,e[v+2],17,606105819),i=u(i,s,o,r,e[v+3],22,-1044525330),r=u(r,i,s,o,e[v+4],7,-176418897),o=u(o,r,i,s,e[v+5],12,1200080426),s=u(s,o,r,i,e[v+6],17,-1473231341),i=u(i,s,o,r,e[v+7],22,-45705983),r=u(r,i,s,o,e[v+8],7,1770035416),o=u(o,r,i,s,e[v+9],12,-1958414417),s=u(s,o,r,i,e[v+10],17,-42063),i=u(i,s,o,r,e[v+11],22,-1990404162),r=u(r,i,s,o,e[v+12],7,1804603682),o=u(o,r,i,s,e[v+13],12,-40341101),s=u(s,o,r,i,e[v+14],17,-1502002290),i=u(i,s,o,r,e[v+15],22,1236535329),r=a(r,i,s,o,e[v+1],5,-165796510),o=a(o,r,i,s,e[v+6],9,-1069501632),s=a(s,o,r,i,e[v+11],14,643717713),i=a(i,s,o,r,e[v+0],20,-373897302),r=a(r,i,s,o,e[v+5],5,-701558691),o=a(o,r,i,s,e[v+10],9,38016083),s=a(s,o,r,i,e[v+15],14,-660478335),i=a(i,s,o,r,e[v+4],20,-405537848),r=a(r,i,s,o,e[v+9],5,568446438),o=a(o,r,i,s,e[v+14],9,-1019803690),s=a(s,o,r,i,e[v+3],14,-187363961),i=a(i,s,o,r,e[v+8],20,1163531501),r=a(r,i,s,o,e[v+13],5,-1444681467),o=a(o,r,i,s,e[v+2],9,-51403784),s=a(s,o,r,i,e[v+7],14,1735328473),i=a(i,s,o,r,e[v+12],20,-1926607734),r=f(r,i,s,o,e[v+5],4,-378558),o=f(o,r,i,s,e[v+8],11,-2022574463),s=f(s,o,r,i,e[v+11],16,1839030562),i=f(i,s,o,r,e[v+14],23,-35309556),r=f(r,i,s,o,e[v+1],4,-1530992060),o=f(o,r,i,s,e[v+4],11,1272893353),s=f(s,o,r,i,e[v+7],16,-155497632),i=f(i,s,o,r,e[v+10],23,-1094730640),r=f(r,i,s,o,e[v+13],4,681279174),o=f(o,r,i,s,e[v+0],11,-358537222),s=f(s,o,r,i,e[v+3],16,-722521979),i=f(i,s,o,r,e[v+6],23,76029189),r=f(r,i,s,o,e[v+9],4,-640364487),o=f(o,r,i,s,e[v+12],11,-421815835),s=f(s,o,r,i,e[v+15],16,530742520),i=f(i,s,o,r,e[v+2],23,-995338651),r=l(r,i,s,o,e[v+0],6,-198630844),o=l(o,r,i,s,e[v+7],10,1126891415),s=l(s,o,r,i,e[v+14],15,-1416354905),i=l(i,s,o,r,e[v+5],21,-57434055),r=l(r,i,s,o,e[v+12],6,1700485571),o=l(o,r,i,s,e[v+3],10,-1894986606),s=l(s,o,r,i,e[v+10],15,-1051523),i=l(i,s,o,r,e[v+1],21,-2054922799),r=l(r,i,s,o,e[v+8],6,1873313359),o=l(o,r,i,s,e[v+15],10,-30611744),s=l(s,o,r,i,e[v+6],15,-1560198380),i=l(i,s,o,r,e[v+13],21,1309151649),r=l(r,i,s,o,e[v+4],6,-145523070),o=l(o,r,i,s,e[v+11],10,-1120210379),s=l(s,o,r,i,e[v+2],15,718787259),i=l(i,s,o,r,e[v+9],21,-343485551),r=t(r,c),i=t(i,h),s=t(s,p),o=t(o,d);return[r,i,s,o]},h={hexdigest:function(e){return s(c(r(e),e.length*8))},hash:function(e){return i(c(r(e),e.length*8))}};return h}),Function.prototype.bind||(Function.prototype.bind=function(e){var t=this,n=Array.prototype.slice,r=Array.prototype.concat,i=n.call(arguments,1);return function(){return t.apply(e?e:this,r.call(i,n.call(arguments,0)))}}),Array.isArray||(Array.isArray=function(e){return Object.prototype.toString.call(e)==="[object Array]"}),Array.prototype.indexOf||(Array.prototype.indexOf=function(e){var t=this.length,n=Number(arguments[1])||0;n=n<0?Math.ceil(n):Math.floor(n),n<0&&(n+=t);for(;n<t;n++)if(n in this&&this[n]===e)return n;return-1}),define("strophe-polyfill",function(){}),function(e,t){if(typeof define=="function"&&define.amd)define("strophe-core",["strophe-sha1","strophe-base64","strophe-md5","strophe-polyfill"],function(){return t.apply(this,arguments)});else{var n=t(e.SHA1,e.Base64,e.MD5);window.Strophe=n.Strophe,window.$build=n.$build,window.$iq=n.$iq,window.$msg=n.$msg,window.$pres=n.$pres,window.SHA1=n.SHA1,window.Base64=n.Base64,window.MD5=n.MD5,window.b64_hmac_sha1=n.SHA1.b64_hmac_sha1,window.b64_sha1=n.SHA1.b64_sha1,window.str_hmac_sha1=n.SHA1.str_hmac_sha1,window.str_sha1=n.SHA1.str_sha1}}(this,function(e,t,n){function i(e,t){return new r.Builder(e,t)}function s(e){return new r.Builder("message",e)}function o(e){return new r.Builder("iq",e)}function u(e){return new r.Builder("presence",e)}var r;return r={VERSION:"@VERSION@",NS:{HTTPBIND:"http://jabber.org/protocol/httpbind",BOSH:"urn:xmpp:xbosh",CLIENT:"jabber:client",AUTH:"jabber:iq:auth",ROSTER:"jabber:iq:roster",PROFILE:"jabber:iq:profile",DISCO_INFO:"http://jabber.org/protocol/disco#info",DISCO_ITEMS:"http://jabber.org/protocol/disco#items",MUC:"http://jabber.org/protocol/muc",SASL:"urn:ietf:params:xml:ns:xmpp-sasl",STREAM:"http://etherx.jabber.org/streams",FRAMING:"urn:ietf:params:xml:ns:xmpp-framing",BIND:"urn:ietf:params:xml:ns:xmpp-bind",SESSION:"urn:ietf:params:xml:ns:xmpp-session",VERSION:"jabber:iq:version",STANZAS:"urn:ietf:params:xml:ns:xmpp-stanzas",XHTML_IM:"http://jabber.org/protocol/xhtml-im",XHTML:"http://www.w3.org/1999/xhtml"},XHTML:{tags:["a","blockquote","br","cite","em","img","li","ol","p","span","strong","ul","body"],attributes:{a:["href"],blockquote:["style"],br:[],cite:["style"],em:[],img:["src","alt","style","height","width"],li:["style"],ol:["style"],p:["style"],span:["style"],strong:[],ul:["style"],body:[]},css:["background-color","color","font-family","font-size","font-style","font-weight","margin-left","margin-right","text-align","text-decoration"],validTag:function(e){for(var t=0;t<r.XHTML.tags.length;t++)if(e==r.XHTML.tags[t])return!0;return!1},validAttribute:function(e,t){if(typeof r.XHTML.attributes[e]!="undefined"&&r.XHTML.attributes[e].length>0)for(var n=0;n<r.XHTML.attributes[e].length;n++)if(t==r.XHTML.attributes[e][n])return!0;return!1},validCSS:function(e){for(var t=0;t<r.XHTML.css.length;t++)if(e==r.XHTML.css[t])return!0;return!1}},Status:{ERROR:0,CONNECTING:1,CONNFAIL:2,AUTHENTICATING:3,AUTHFAIL:4,CONNECTED:5,DISCONNECTED:6,DISCONNECTING:7,ATTACHED:8,REDIRECT:9},LogLevel:{DEBUG:0,INFO:1,WARN:2,ERROR:3,FATAL:4},ElementType:{NORMAL:1,TEXT:3,CDATA:4,FRAGMENT:11},TIMEOUT:1.1,SECONDARY_TIMEOUT:.1,addNamespace:function(e,t){r.NS[e]=t},forEachChild:function(e,t,n){var i,s;for(i=0;i<e.childNodes.length;i++)s=e.childNodes[i],s.nodeType==r.ElementType.NORMAL&&(!t||this.isTagEqual(s,t))&&n(s)},isTagEqual:function(e,t){return e.tagName==t},_xmlGenerator:null,_makeGenerator:function(){var e;return document.implementation.createDocument===undefined||document.implementation.createDocument&&document.documentMode&&document.documentMode<10?(e=this._getIEXmlDom(),e.appendChild(e.createElement("strophe"))):e=document.implementation.createDocument("jabber:client","strophe",null),e},xmlGenerator:function(){return r._xmlGenerator||(r._xmlGenerator=r._makeGenerator()),r._xmlGenerator},_getIEXmlDom:function(){var e=null,t=["Msxml2.DOMDocument.6.0","Msxml2.DOMDocument.5.0","Msxml2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument","MSXML.DOMDocument","Microsoft.XMLDOM"];for(var n=0;n<t.length;n++){if(e!==null)break;try{e=new ActiveXObject(t[n])}catch(r){e=null}}return e},xmlElement:function(e){if(!e)return null;var t=r.xmlGenerator().createElement(e),n,i,s;for(n=1;n<arguments.length;n++){var o=arguments[n];if(!o)continue;if(typeof o=="string"||typeof o=="number")t.appendChild(r.xmlTextNode(o));else if(typeof o=="object"&&typeof o.sort=="function")for(i=0;i<o.length;i++){var u=o[i];typeof u=="object"&&typeof u.sort=="function"&&u[1]!==undefined&&u[1]!==null&&t.setAttribute(u[0],u[1])}else if(typeof o=="object")for(s in o)o.hasOwnProperty(s)&&o[s]!==undefined&&o[s]!==null&&t.setAttribute(s,o[s])}return t},xmlescape:function(e){return e=e.replace(/\&/g,"&amp;"),e=e.replace(/</g,"&lt;"),e=e.replace(/>/g,"&gt;"),e=e.replace(/'/g,"&apos;"),e=e.replace(/"/g,"&quot;"),e},xmlunescape:function(e){return e=e.replace(/\&amp;/g,"&"),e=e.replace(/&lt;/g,"<"),e=e.replace(/&gt;/g,">"),e=e.replace(/&apos;/g,"'"),e=e.replace(/&quot;/g,'"'),e},xmlTextNode:function(e){return r.xmlGenerator().createTextNode(e)},xmlHtmlNode:function(e){var t;if(window.DOMParser){var n=new DOMParser;t=n.parseFromString(e,"text/xml")}else t=new ActiveXObject("Microsoft.XMLDOM"),t.async="false",t.loadXML(e);return t},getText:function(e){if(!e)return null;var t="";e.childNodes.length===0&&e.nodeType==r.ElementType.TEXT&&(t+=e.nodeValue);for(var n=0;n<e.childNodes.length;n++)e.childNodes[n].nodeType==r.ElementType.TEXT&&(t+=e.childNodes[n].nodeValue);return r.xmlescape(t)},copyElement:function(e){var t,n;if(e.nodeType==r.ElementType.NORMAL){n=r.xmlElement(e.tagName);for(t=0;t<e.attributes.length;t++)n.setAttribute(e.attributes[t].nodeName,e.attributes[t].value);for(t=0;t<e.childNodes.length;t++)n.appendChild(r.copyElement(e.childNodes[t]))}else e.nodeType==r.ElementType.TEXT&&(n=r.xmlGenerator().createTextNode(e.nodeValue));return n},createHtml:function(e){var t,n,i,s,o,u,a,f,l,c,h;if(e.nodeType==r.ElementType.NORMAL){s=e.nodeName.toLowerCase();if(r.XHTML.validTag(s))try{n=r.xmlElement(s);for(t=0;t<r.XHTML.attributes[s].length;t++){o=r.XHTML.attributes[s][t],u=e.getAttribute(o);if(typeof u=="undefined"||u===null||u===""||u===!1||u===0)continue;o=="style"&&typeof u=="object"&&typeof u.cssText!="undefined"&&(u=u.cssText);if(o=="style"){a=[],f=u.split(";");for(i=0;i<f.length;i++)l=f[i].split(":"),c=l[0].replace(/^\s*/,"").replace(/\s*$/,"").toLowerCase(),r.XHTML.validCSS(c)&&(h=l[1].replace(/^\s*/,"").replace(/\s*$/,""),a.push(c+": "+h));a.length>0&&(u=a.join("; "),n.setAttribute(o,u))}else n.setAttribute(o,u)}for(t=0;t<e.childNodes.length;t++)n.appendChild(r.createHtml(e.childNodes[t]))}catch(p){n=r.xmlTextNode("")}else{n=r.xmlGenerator().createDocumentFragment();for(t=0;t<e.childNodes.length;t++)n.appendChild(r.createHtml(e.childNodes[t]))}}else if(e.nodeType==r.ElementType.FRAGMENT){n=r.xmlGenerator().createDocumentFragment();for(t=0;t<e.childNodes.length;t++)n.appendChild(r.createHtml(e.childNodes[t]))}else e.nodeType==r.ElementType.TEXT&&(n=r.xmlTextNode(e.nodeValue));return n},escapeNode:function(e){return typeof e!="string"?e:e.replace(/^\s+|\s+$/g,"").replace(/\\/g,"\\5c").replace(/ /g,"\\20").replace(/\"/g,"\\22").replace(/\&/g,"\\26").replace(/\'/g,"\\27").replace(/\//g,"\\2f").replace(/:/g,"\\3a").replace(/</g,"\\3c").replace(/>/g,"\\3e").replace(/@/g,"\\40")},unescapeNode:function(e){return typeof e!="string"?e:e.replace(/\\20/g," ").replace(/\\22/g,'"').replace(/\\26/g,"&").replace(/\\27/g,"'").replace(/\\2f/g,"/").replace(/\\3a/g,":").replace(/\\3c/g,"<").replace(/\\3e/g,">").replace(/\\40/g,"@").replace(/\\5c/g,"\\")},getNodeFromJid:function(e){return e.indexOf("@")<0?null:e.split("@")[0]},getDomainFromJid:function(e){var t=r.getBareJidFromJid(e);if(t.indexOf("@")<0)return t;var n=t.split("@");return n.splice(0,1),n.join("@")},getResourceFromJid:function(e){var t=e.split("/");return t.length<2?null:(t.splice(0,1),t.join("/"))},getBareJidFromJid:function(e){return e?e.split("/")[0]:null},log:function(e,t){return},debug:function(e){this.log(this.LogLevel.DEBUG,e)},info:function(e){this.log(this.LogLevel.INFO,e)},warn:function(e){this.log(this.LogLevel.WARN,e)},error:function(e){this.log(this.LogLevel.ERROR,e)},fatal:function(e){this.log(this.LogLevel.FATAL,e)},serialize:function(e){var t;if(!e)return null;typeof e.tree=="function"&&(e=e.tree());var n=e.nodeName,i,s;e.getAttribute("_realname")&&(n=e.getAttribute("_realname")),t="<"+n;for(i=0;i<e.attributes.length;i++)e.attributes[i].nodeName!="_realname"&&(t+=" "+e.attributes[i].nodeName+"='"+e.attributes[i].value.replace(/&/g,"&amp;").replace(/\'/g,"&apos;").replace(/>/g,"&gt;").replace(/</g,"&lt;")+"'");if(e.childNodes.length>0){t+=">";for(i=0;i<e.childNodes.length;i++){s=e.childNodes[i];switch(s.nodeType){case r.ElementType.NORMAL:t+=r.serialize(s);break;case r.ElementType.TEXT:t+=r.xmlescape(s.nodeValue);break;case r.ElementType.CDATA:t+="<![CDATA["+s.nodeValue+"]]>"}}t+="</"+n+">"}else t+="/>";return t},_requestId:0,_connectionPlugins:{},addConnectionPlugin:function(e,t){r._connectionPlugins[e]=t}},r.Builder=function(e,t){if(e=="presence"||e=="message"||e=="iq")t&&!t.xmlns?t.xmlns=r.NS.CLIENT:t||(t={xmlns:r.NS.CLIENT});this.nodeTree=r.xmlElement(e,t),this.node=this.nodeTree},r.Builder.prototype={tree:function(){return this.nodeTree},toString:function(){return r.serialize(this.nodeTree)},up:function(){return this.node=this.node.parentNode,this},attrs:function(e){for(var t in e)e.hasOwnProperty(t)&&(e[t]===undefined?this.node.removeAttribute(t):this.node.setAttribute(t,e[t]));return this},c:function(e,t,n){var i=r.xmlElement(e,t,n);return this.node.appendChild(i),typeof n!="string"&&(this.node=i),this},cnode:function(e){var t,n=r.xmlGenerator();try{t=n.importNode!==undefined}catch(i){t=!1}var s=t?n.importNode(e,!0):r.copyElement(e);return this.node.appendChild(s),this.node=s,this},t:function(e){var t=r.xmlTextNode(e);return this.node.appendChild(t),this},h:function(e){var t=document.createElement("body");t.innerHTML=e;var n=r.createHtml(t);while(n.childNodes.length>0)this.node.appendChild(n.childNodes[0]);return this}},r.Handler=function(e,t,n,i,s,o,u){this.handler=e,this.ns=t,this.name=n,this.type=i,this.id=s,this.options=u||{matchBare:!1},this.options.matchBare||(this.options.matchBare=!1),this.options.matchBare?this.from=o?r.getBareJidFromJid(o):null:this.from=o,this.user=!0},r.Handler.prototype={isMatch:function(e){var t,n=null;this.options.matchBare?n=r.getBareJidFromJid(e.getAttribute("from")):n=e.getAttribute("from"),t=!1;if(!this.ns)t=!0;else{var i=this;r.forEachChild(e,null,function(e){e.getAttribute("xmlns")==i.ns&&(t=!0)}),t=t||e.getAttribute("xmlns")==this.ns}var s=e.getAttribute("type");return!t||!!this.name&&!r.isTagEqual(e,this.name)||!!this.type&&(Array.isArray(this.type)?this.type.indexOf(s)==-1:s!=this.type)||!!this.id&&e.getAttribute("id")!=this.id||!!this.from&&n!=this.from?!1:!0},run:function(e){var t=null;try{t=this.handler(e)}catch(n){throw n.sourceURL?r.fatal("error: "+this.handler+" "+n.sourceURL+":"+n.line+" - "+n.name+": "+n.message):n.fileName?(typeof console!="undefined"&&(console.trace(),console.error(this.handler," - error - ",n,n.message)),r.fatal("error: "+this.handler+" "+n.fileName+":"+n.lineNumber+" - "+n.name+": "+n.message)):r.fatal("error: "+n.message+"\n"+n.stack),n}return t},toString:function(){return"{Handler: "+this.handler+"("+this.name+","+this.id+","+this.ns+")}"}},r.TimedHandler=function(e,t){this.period=e,this.handler=t,this.lastCalled=(new Date).getTime(),this.user=!0},r.TimedHandler.prototype={run:function(){return this.lastCalled=(new Date).getTime(),this.handler()},reset:function(){this.lastCalled=(new Date).getTime()},toString:function(){return"{TimedHandler: "+this.handler+"("+this.period+")}"}},r.Connection=function(e,t){this.service=e,this.options=t||{};var n=this.options.protocol||"";e.indexOf("ws:")===0||e.indexOf("wss:")===0||n.indexOf("ws")===0?this._proto=new r.Websocket(this):this._proto=new r.Bosh(this),this.jid="",this.domain=null,this.features=null,this._sasl_data={},this.do_session=!1,this.do_bind=!1,this.timedHandlers=[],this.handlers=[],this.removeTimeds=[],this.removeHandlers=[],this.addTimeds=[],this.addHandlers=[],this._authentication={},this._idleTimeout=null,this._disconnectTimeout=null,this.authenticated=!1,this.connected=!1,this.disconnecting=!1,this.do_authentication=!0,this.paused=!1,this.restored=!1,this._data=[],this._uniqueId=0,this._sasl_success_handler=null,this._sasl_failure_handler=null,this._sasl_challenge_handler=null,this.maxRetries=5,this._idleTimeout=setTimeout(this._onIdle.bind(this),100);for(var i in r._connectionPlugins)if(r._connectionPlugins.hasOwnProperty(i)){var s=r._connectionPlugins[i],o=function(){};o.prototype=s,this[i]=new o,this[i].init(this)}},r.Connection.prototype={reset:function(){this._proto._reset(),this.do_session=!1,this.do_bind=!1,this.timedHandlers=[],this.handlers=[],this.removeTimeds=[],this.removeHandlers=[],this.addTimeds=[],this.addHandlers=[],this._authentication={},this.authenticated=!1,this.connected=!1,this.disconnecting=!1,this.restored=!1,this._data=[],this._requests=[],this._uniqueId=0},pause:function(){this.paused=!0},resume:function(){this.paused=!1},getUniqueId:function(e){var t="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=Math.random()*16|0,n=e=="x"?t:t&3|8;return n.toString(16)});return typeof e=="string"||typeof e=="number"?t+":"+e:t+""},connect:function(e,t,n,i,s,o,u){this.jid=e,this.authzid=r.getBareJidFromJid(this.jid),this.authcid=u||r.getNodeFromJid(this.jid),this.pass=t,this.servtype="xmpp",this.connect_callback=n,this.disconnecting=!1,this.connected=!1,this.authenticated=!1,this.restored=!1,this.domain=r.getDomainFromJid(this.jid),this._changeConnectStatus(r.Status.CONNECTING,null),this._proto._connect(i,s,o)},attach:function(e,t,n,i,s,o,u){if(!(this._proto instanceof r.Bosh))throw{name:"StropheSessionError",message:'The "attach" method can only be used with a BOSH connection.'};this._proto._attach(e,t,n,i,s,o,u)},restore:function(e,t,n,r,i){if(!this._sessionCachingSupported())throw{name:"StropheSessionError",message:'The "restore" method can only be used with a BOSH connection.'};this._proto._restore(e,t,n,r,i)},_sessionCachingSupported:function(){if(this._proto instanceof r.Bosh){if(!JSON)return!1;try{window.sessionStorage.setItem("_strophe_","_strophe_"),window.sessionStorage.removeItem("_strophe_")}catch(e){return!1}return!0}return!1},xmlInput:function(e){return},xmlOutput:function(e){return},rawInput:function(e){return},rawOutput:function(e){return},nextValidRid:function(e){return},send:function(e){if(e===null)return;if(typeof e.sort=="function")for(var t=0;t<e.length;t++)this._queueData(e[t]);else typeof e.tree=="function"?this._queueData(e.tree()):this._queueData(e);this._proto._send()},flush:function(){clearTimeout(this._idleTimeout),this._onIdle()},sendIQ:function(e,t,n,i){var s=null,o=this;typeof e.tree=="function"&&(e=e.tree());var u=e.getAttribute("id");u||(u=this.getUniqueId("sendIQ"),e.setAttribute("id",u));var a=e.getAttribute("to"),f=this.jid,l=this.addHandler(function(e){s&&o.deleteTimedHandler(s);var i=!1,u=e.getAttribute("from");if(u===a||a===null&&(u===r.getBareJidFromJid(f)||u===r.getDomainFromJid(f)||u===f))i=!0;if(!i)throw{name:"StropheError",message:"Got answer to IQ from wrong jid:"+u+"\nExpected jid: "+a};var l=e.getAttribute("type");if(l=="result")t&&t(e);else{if(l!="error")throw{name:"StropheError",message:"Got bad IQ type of "+l};n&&n(e)}},null,"iq",["error","result"],u);return i&&(s=this.addTimedHandler(i,function(){return o.deleteHandler(l),n&&n(null),!1})),this.send(e),u},_queueData:function(e){if(e===null||!e.tagName||!e.childNodes)throw{name:"StropheError",message:"Cannot queue non-DOMElement."};this._data.push(e)},_sendRestart:function(){this._data.push("restart"),this._proto._sendRestart(),this._idleTimeout=setTimeout(this._onIdle.bind(this),100)},addTimedHandler:function(e,t){var n=new r.TimedHandler(e,t);return this.addTimeds.push(n),n},deleteTimedHandler:function(e){this.removeTimeds.push(e)},addHandler:function(e,t,n,i,s,o,u){var a=new r.Handler(e,t,n,i,s,o,u);return this.addHandlers.push(a),a},deleteHandler:function(e){this.removeHandlers.push(e);var t=this.addHandlers.indexOf(e);t>=0&&this.addHandlers.splice(t,1)},disconnect:function(e){this._changeConnectStatus(r.Status.DISCONNECTING,e),r.info("Disconnect was called because: "+e);if(this.connected){var t=!1;this.disconnecting=!0,this.authenticated&&(t=u({xmlns:r.NS.CLIENT,type:"unavailable"})),this._disconnectTimeout=this._addSysTimedHandler(3e3,this._onDisconnectTimeout.bind(this)),this._proto._disconnect(t)}else r.info("Disconnect was called before Strophe connected to the server"),this._proto._abortAllRequests()},_changeConnectStatus:function(e,t){for(var n in r._connectionPlugins)if(r._connectionPlugins.hasOwnProperty(n)){var i=this[n];if(i.statusChanged)try{i.statusChanged(e,t)}catch(s){r.error(""+n+" plugin caused an exception "+"changing status: "+s)}}if(this.connect_callback)try{this.connect_callback(e,t)}catch(o){r.error("User connection callback caused an exception: "+o)}},_doDisconnect:function(e){typeof this._idleTimeout=="number"&&clearTimeout(this._idleTimeout),this._disconnectTimeout!==null&&(this.deleteTimedHandler(this._disconnectTimeout),this._disconnectTimeout=null),r.info("_doDisconnect was called"),this._proto._doDisconnect(),this.authenticated=!1,this.disconnecting=!1,this.restored=!1,this.handlers=[],this.timedHandlers=[],this.removeTimeds=[],this.removeHandlers=[],this.addTimeds=[],this.addHandlers=[],this._changeConnectStatus(r.Status.DISCONNECTED,e),this.connected=!1},_dataRecv:function(e,t){r.info("_dataRecv called");var n=this._proto._reqToData(e);if(n===null)return;this.xmlInput!==r.Connection.prototype.xmlInput&&(n.nodeName===this._proto.strip&&n.childNodes.length?this.xmlInput(n.childNodes[0]):this.xmlInput(n)),this.rawInput!==r.Connection.prototype.rawInput&&(t?this.rawInput(t):this.rawInput(r.serialize(n)));var i,s;while(this.removeHandlers.length>0)s=this.removeHandlers.pop(),i=this.handlers.indexOf(s),i>=0&&this.handlers.splice(i,1);while(this.addHandlers.length>0)this.handlers.push(this.addHandlers.pop());if(this.disconnecting&&this._proto._emptyQueue()){this._doDisconnect();return}var o=n.getAttribute("type"),u,a;if(o!==null&&o=="terminate"){if(this.disconnecting)return;u=n.getAttribute("condition"),a=n.getElementsByTagName("conflict"),u!==null?(u=="remote-stream-error"&&a.length>0&&(u="conflict"),this._changeConnectStatus(r.Status.CONNFAIL,u)):this._changeConnectStatus(r.Status.CONNFAIL,"unknown"),this._doDisconnect(u);return}var f=this;r.forEachChild(n,null,function(e){var t,n;n=f.handlers,f.handlers=[];for(t=0;t<n.length;t++){var i=n[t];try{i.isMatch(e)&&(f.authenticated||!i.user)?i.run(e)&&f.handlers.push(i):f.handlers.push(i)}catch(s){r.warn("Removing Strophe handlers due to uncaught exception: "+s.message)}}})},mechanisms:{},_connect_cb:function(e,t,n){r.info("_connect_cb was called"),this.connected=!0;var i=this._proto._reqToData(e);if(!i)return;this.xmlInput!==r.Connection.prototype.xmlInput&&(i.nodeName===this._proto.strip&&i.childNodes.length?this.xmlInput(i.childNodes[0]):this.xmlInput(i)),this.rawInput!==r.Connection.prototype.rawInput&&(n?this.rawInput(n):this.rawInput(r.serialize(i)));var s=this._proto._connect_cb(i);if(s===r.Status.CONNFAIL)return;this._authentication.sasl_scram_sha1=!1,this._authentication.sasl_plain=!1,this._authentication.sasl_digest_md5=!1,this._authentication.sasl_anonymous=!1,this._authentication.legacy_auth=!1;var o;i.getElementsByTagNameNS?o=i.getElementsByTagNameNS(r.NS.STREAM,"features").length>0:o=i.getElementsByTagName("stream:features").length>0||i.getElementsByTagName("features").length>0;var u=i.getElementsByTagName("mechanism"),a=[],f,l,c=!1;if(!o){this._proto._no_auth_received(t);return}if(u.length>0)for(f=0;f<u.length;f++)l=r.getText(u[f]),this.mechanisms[l]&&a.push(this.mechanisms[l]);this._authentication.legacy_auth=i.getElementsByTagName("auth").length>0,c=this._authentication.legacy_auth||a.length>0;if(!c){this._proto._no_auth_received(t);return}this.do_authentication!==!1&&this.authenticate(a)},authenticate:function(e){var n;for(n=0;n<e.length-1;++n){var s=n;for(var u=n+1;u<e.length;++u)e[u].prototype.priority>e[s].prototype.priority&&(s=u);if(s!=n){var a=e[n];e[n]=e[s],e[s]=a}}var f=!1;for(n=0;n<e.length;++n){if(!e[n].test(this))continue;this._sasl_success_handler=this._addSysHandler(this._sasl_success_cb.bind(this),null,"success",null,null),this._sasl_failure_handler=this._addSysHandler(this._sasl_failure_cb.bind(this),null,"failure",null,null),this._sasl_challenge_handler=this._addSysHandler(this._sasl_challenge_cb.bind(this),null,"challenge",null,null),this._sasl_mechanism=new e[n],this._sasl_mechanism.onStart(this);var l=i("auth",{xmlns:r.NS.SASL,mechanism:this._sasl_mechanism.name});if(this._sasl_mechanism.isClientFirst){var c=this._sasl_mechanism.onChallenge(this,null);l.t(t.encode(c))}this.send(l.tree()),f=!0;break}f||(r.getNodeFromJid(this.jid)===null?(this._changeConnectStatus(r.Status.CONNFAIL,"x-strophe-bad-non-anon-jid"),this.disconnect("x-strophe-bad-non-anon-jid")):(this._changeConnectStatus(r.Status.AUTHENTICATING,null),this._addSysHandler(this._auth1_cb.bind(this),null,null,null,"_auth_1"),this.send(o({type:"get",to:this.domain,id:"_auth_1"}).c("query",{xmlns:r.NS.AUTH}).c("username",{}).t(r.getNodeFromJid(this.jid)).tree())))},_sasl_challenge_cb:function(e){var n=t.decode(r.getText(e)),s=this._sasl_mechanism.onChallenge(this,n),o=i("response",{xmlns:r.NS.SASL});return s!==""&&o.t(t.encode(s)),this.send(o.tree()),!0},_auth1_cb:function(e){var t=o({type:"set",id:"_auth_2"}).c("query",{xmlns:r.NS.AUTH}).c("username",{}).t(r.getNodeFromJid(this.jid)).up().c("password").t(this.pass);return r.getResourceFromJid(this.jid)||(this.jid=r.getBareJidFromJid(this.jid)+"/strophe"),t.up().c("resource",{}).t(r.getResourceFromJid(this.jid)),this._addSysHandler(this._auth2_cb.bind(this),null,null,null,"_auth_2"),this.send(t.tree()),!1},_sasl_success_cb:function(e){if(this._sasl_data["server-signature"]){var n,i=t.decode(r.getText(e)),s=/([a-z]+)=([^,]+)(,|$)/,o=i.match(s);o[1]=="v"&&(n=o[2]);if(n!=this._sasl_data["server-signature"])return this.deleteHandler(this._sasl_failure_handler),this._sasl_failure_handler=null,this._sasl_challenge_handler&&(this.deleteHandler(this._sasl_challenge_handler),this._sasl_challenge_handler=null),this._sasl_data={},this._sasl_failure_cb(null)}r.info("SASL authentication succeeded."),this._sasl_mechanism&&this._sasl_mechanism.onSuccess(),this.deleteHandler(this._sasl_failure_handler),this._sasl_failure_handler=null,this._sasl_challenge_handler&&(this.deleteHandler(this._sasl_challenge_handler),this._sasl_challenge_handler=null);var u=[],a=function(e,t){while(e.length)this.deleteHandler(e.pop());return this._sasl_auth1_cb.bind(this)(t),!1};return u.push(this._addSysHandler(function(e){a.bind(this)(u,e)}.bind(this),null,"stream:features",null,null)),u.push(this._addSysHandler(function(e){a.bind(this)(u,e)}.bind(this),r.NS.STREAM,"features",null,null)),this._sendRestart(),!1},_sasl_auth1_cb:function(e){this.features=e;var t,n;for(t=0;t<e.childNodes.length;t++)n=e.childNodes[t],n.nodeName=="bind"&&(this.do_bind=!0),n.nodeName=="session"&&(this.do_session=!0);if(!this.do_bind)return this._changeConnectStatus(r.Status.AUTHFAIL,null),!1;this._addSysHandler(this._sasl_bind_cb.bind(this),null,null,null,"_bind_auth_2");var i=r.getResourceFromJid(this.jid);return i?this.send(o({type:"set",id:"_bind_auth_2"}).c("bind",{xmlns:r.NS.BIND}).c("resource",{}).t(i).tree()):this.send(o({type:"set",id:"_bind_auth_2"}).c("bind",{xmlns:r.NS.BIND}).tree()),!1},_sasl_bind_cb:function(e){if(e.getAttribute("type")=="error"){r.info("SASL binding failed.");var t=e.getElementsByTagName("conflict"),n;return t.length>0&&(n="conflict"),this._changeConnectStatus(r.Status.AUTHFAIL,n),!1}var i=e.getElementsByTagName("bind"),s;if(!(i.length>0))return r.info("SASL binding failed."),this._changeConnectStatus(r.Status.AUTHFAIL,null),!1;s=i[0].getElementsByTagName("jid"),s.length>0&&(this.jid=r.getText(s[0]),this.do_session?(this._addSysHandler(this._sasl_session_cb.bind(this),null,null,null,"_session_auth_2"),this.send(o({type:"set",id:"_session_auth_2"}).c("session",{xmlns:r.NS.SESSION}).tree())):(this.authenticated=!0,this._changeConnectStatus(r.Status.CONNECTED,null)))},_sasl_session_cb:function(e){if(e.getAttribute("type")=="result")this.authenticated=!0,this._changeConnectStatus(r.Status.CONNECTED,null);else if(e.getAttribute("type")=="error")return r.info("Session creation failed."),this._changeConnectStatus(r.Status.AUTHFAIL,null),!1;return!1},_sasl_failure_cb:function(e){return this._sasl_success_handler&&(this.deleteHandler(this._sasl_success_handler),this._sasl_success_handler=null),this._sasl_challenge_handler&&(this.deleteHandler(this._sasl_challenge_handler),this._sasl_challenge_handler=null),this._sasl_mechanism&&this._sasl_mechanism.onFailure(),this._changeConnectStatus(r.Status.AUTHFAIL,null),!1},_auth2_cb:function(e){return e.getAttribute("type")=="result"?(this.authenticated=!0,this._changeConnectStatus(r.Status.CONNECTED,null)):e.getAttribute("type")=="error"&&(this._changeConnectStatus(r.Status.AUTHFAIL,null),this.disconnect("authentication failed")),!1},_addSysTimedHandler:function(e,t){var n=new r.TimedHandler(e,t);return n.user=!1,this.addTimeds.push(n),n},_addSysHandler:function(e,t,n,i,s){var o=new r.Handler(e,t,n,i,s);return o.user=!1,this.addHandlers.push(o),o},_onDisconnectTimeout:function(){return r.info("_onDisconnectTimeout was called"),this._proto._onDisconnectTimeout(),this._doDisconnect(),!1},_onIdle:function(){var e,t,n,r;while(this.addTimeds.length>0)this.timedHandlers.push(this.addTimeds.pop());while(this.removeTimeds.length>0)t=this.removeTimeds.pop(),e=this.timedHandlers.indexOf(t),e>=0&&this.timedHandlers.splice(e,1);var i=(new Date).getTime();r=[];for(e=0;e<this.timedHandlers.length;e++){t=this.timedHandlers[e];if(this.authenticated||!t.user)n=t.lastCalled+t.period,n-i<=0?t.run()&&r.push(t):r.push(t)}this.timedHandlers=r,clearTimeout(this._idleTimeout),this._proto._onIdle(),this.connected&&(this._idleTimeout=setTimeout(this._onIdle.bind(this),100))}},r.SASLMechanism=function(e,t,n){this.name=e,this.isClientFirst=t,this.priority=n},r.SASLMechanism.prototype={test:function(e){return!0},onStart:function(e){this._connection=e},onChallenge:function(e,t){throw new Error("You should implement challenge handling!")},onFailure:function(){this._connection=null},onSuccess:function(){this._connection=null}},r.SASLAnonymous=function(){},r.SASLAnonymous.prototype=new r.SASLMechanism("ANONYMOUS",!1,10),r.SASLAnonymous.test=function(e){return e.authcid===null},r.Connection.prototype.mechanisms[r.SASLAnonymous.prototype.name]=r.SASLAnonymous,r.SASLPlain=function(){},r.SASLPlain.prototype=new r.SASLMechanism("PLAIN",!0,20),r.SASLPlain.test=function(e){return e.authcid!==null},r.SASLPlain.prototype.onChallenge=function(e){var t=e.authzid;return t+="\0",t+=e.authcid,t+="\0",t+=e.pass,t},r.Connection.prototype.mechanisms[r.SASLPlain.prototype.name]=r.SASLPlain,r.SASLSHA1=function(){},r.SASLSHA1.prototype=new r.SASLMechanism("SCRAM-SHA-1",!0,40),r.SASLSHA1.test=function(e){return e.authcid!==null},r.SASLSHA1.prototype.onChallenge=function(r,i,s){var o=s||n.hexdigest(Math.random()*1234567890),u="n="+r.authcid;return u+=",r=",u+=o,r._sasl_data.cnonce=o,r._sasl_data["client-first-message-bare"]=u,u="n,,"+u,this.onChallenge=function(n,r){var i,s,o,u,a,f,l,c,h,p,d,v="c=biws,",m=n._sasl_data["client-first-message-bare"]+","+r+",",g=n._sasl_data.cnonce,y=/([a-z]+)=([^,]+)(,|$)/;while(r.match(y)){var b=r.match(y);r=r.replace(b[0],"");switch(b[1]){case"r":i=b[2];break;case"s":s=b[2];break;case"i":o=b[2]}}if(i.substr(0,g.length)!==g)return n._sasl_data={},n._sasl_failure_cb();v+="r="+i,m+=v,s=t.decode(s),s+="\0\0\0\ 1",u=f=e.core_hmac_sha1(n.pass,s);for(l=1;l<o;l++){a=e.core_hmac_sha1(n.pass,e.binb2str(f));for(c=0;c<5;c++)u[c]^=a[c];f=a}u=e.binb2str(u),h=e.core_hmac_sha1(u,"Client Key"),p=e.str_hmac_sha1(u,"Server Key"),d=e.core_hmac_sha1(e.str_sha1(e.binb2str(h)),m),n._sasl_data["server-signature"]=e.b64_hmac_sha1(p,m);for(c=0;c<5;c++)h[c]^=d[c];return v+=",p="+t.encode(e.binb2str(h)),v}.bind(this),u},r.Connection.prototype.mechanisms[r.SASLSHA1.prototype.name]=r.SASLSHA1,r.SASLMD5=function(){},r.SASLMD5.prototype=new r.SASLMechanism("DIGEST-MD5",!1,30),r.SASLMD5.test=function(e){return e.authcid!==null},r.SASLMD5.prototype._quote=function(e){return'"'+e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'},r.SASLMD5.prototype.onChallenge=function(e,t,r){var i=/([a-z]+)=("[^"]+"|[^,"]+)(?:,|$)/,s=r||n.hexdigest(""+Math.random()*1234567890),o="",u=null,a="",f="",l;while(t.match(i)){l=t.match(i),t=t.replace(l[0],""),l[2]=l[2].replace(/^"(.+)"$/,"$1");switch(l[1]){case"realm":o=l[2];break;case"nonce":a=l[2];break;case"qop":f=l[2];break;case"host":u=l[2]}}var c=e.servtype+"/"+e.domain;u!==null&&(c=c+"/"+u);var h=n.hash(e.authcid+":"+o+":"+this._connection.pass)+":"+a+":"+s,p="AUTHENTICATE:"+c,d="";return d+="charset=utf-8,",d+="username="+this._quote(e.authcid)+",",d+="realm="+this._quote(o)+",",d+="nonce="+this._quote(a)+",",d+="nc=00000001,",d+="cnonce="+this._quote(s)+",",d+="digest-uri="+this._quote(c)+",",d+="response="+n.hexdigest(n.hexdigest(h)+":"+a+":00000001:"+s+":auth:"+n.hexdigest(p))+",",d+="qop=auth",this.onChallenge=function(){return""}.bind(this),d},r.Connection.prototype.mechanisms[r.SASLMD5.prototype.name]=r.SASLMD5,{Strophe:r,$build:i,$msg:s,$iq:o,$pres:u,SHA1:e,Base64:t,MD5:n}}),function(e,t){if(typeof define!="function"||!define.amd)return t(Strophe,$build);define("strophe-bosh",["strophe-core"],function(e){return t(e.Strophe,e.$build)})}(this,function(e,t){return e.Request=function(t,n,r,i){this.id=++e._requestId,this.xmlData=t,this.data=e.serialize(t),this.origFunc=n,this.func=n,this.rid=r,this.date=NaN,this.sends=i||0,this.abort=!1,this.dead=null,this.age=function(){if(!this.date)return 0;var e=new Date;return(e-this.date)/1e3},this.timeDead=function(){if(!this.dead)return 0;var e=new Date;return(e-this.dead)/1e3},this.xhr=this._newXHR()},e.Request.prototype={getResponse:function(){var t=null;if(this.xhr.responseXML&&this.xhr.responseXML.documentElement){t=this.xhr.responseXML.documentElement;if(t.tagName=="parsererror")throw e.error("invalid response received"),e.error("responseText: "+this.xhr.responseText),e.error("responseXML: "+e.serialize(this.xhr.responseXML)),"parsererror"}else this.xhr.responseText&&(e.error("invalid response received"),e.error("responseText: "+this.xhr.responseText),e.error("responseXML: "+e.serialize(this.xhr.responseXML)));return t},_newXHR:function(){var e=null;return window.XMLHttpRequest?(e=new XMLHttpRequest,e.overrideMimeType&&e.overrideMimeType("text/xml; charset=utf-8")):window.ActiveXObject&&(e=new ActiveXObject("Microsoft.XMLHTTP")),e.onreadystatechange=this.func.bind(null,this),e}},e.Bosh=function(e){this._conn=e,this.rid=Math.floor(Math.random()*4294967295),this.sid=null,this.hold=1,this.wait=60,this.window=5,this.errors=0,this._requests=[]},e.Bosh.prototype={strip:null,_buildBody:function(){var n=t("body",{rid:this.rid++,xmlns:e.NS.HTTPBIND});return this.sid!==null&&n.attrs({sid:this.sid}),this._conn.options.keepalive&&this._cacheSession(),n},_reset:function(){this.rid=Math.floor(Math.random()*4294967295),this.sid=null,this.errors=0,window.sessionStorage.removeItem("strophe-bosh-session"),this._conn.nextValidRid(this.rid)},_connect:function(t,n,r){this.wait=t||this.wait,this.hold=n||this.hold,this.errors=0;var i=this._buildBody().attrs({to:this._conn.domain,"xml:lang":"en",wait:this.wait,hold:this.hold,content:"text/xml; charset=utf-8",ver:"1.6","xmpp:version":"1.0","xmlns:xmpp":e.NS.BOSH});r&&i.attrs({route:r});var s=this._conn._connect_cb;this._requests.push(new e.Request(i.tree(),this._onRequestStateChange.bind(this,s.bind(this._conn)),i.tree().getAttribute("rid"))),this._throttledRequestHandler()},_attach:function(t,n,r,i,s,o,u){this._conn.jid=t,this.sid=n,this.rid=r,this._conn.connect_callback=i,this._conn.domain=e.getDomainFromJid(this._conn.jid),this._conn.authenticated=!0,this._conn.connected=!0,this.wait=s||this.wait,this.hold=o||this.hold,this.window=u||this.window,this._conn._changeConnectStatus(e.Status.ATTACHED,null)},_restore:function(t,n,r,i,s){var o=JSON.parse(window.sessionStorage.getItem("strophe-bosh-session"));if(!(typeof o!="undefined"&&o!==null&&o.rid&&o.sid&&o.jid)||typeof t!="undefined"&&t!=="null"&&e.getBareJidFromJid(o.jid)!=e.getBareJidFromJid(t))throw{name:"StropheSessionError",message:"_restore: no restoreable session."};this._conn.restored=!0,this._attach(o.jid,o.sid,o.rid,n,r,i,s)},_cacheSession:function(){this._conn.authenticated?this._conn.jid&&this.rid&&this.sid&&window.sessionStorage.setItem("strophe-bosh-session",JSON.stringify({jid:this._conn.jid,rid:this.rid,sid:this.sid})):window.sessionStorage.removeItem("strophe-bosh-session")},_connect_cb:function(t){var n=t.getAttribute("type"),r,i;if(n!==null&&n=="terminate")return r=t.getAttribute("condition"),e.error("BOSH-Connection failed: "+r),i=t.getElementsByTagName("conflict"),r!==null?(r=="remote-stream-error"&&i.length>0&&(r="conflict"),this._conn._changeConnectStatus(e.Status.CONNFAIL,r)):this._conn._changeConnectStatus(e.Status.CONNFAIL,"unknown"),this._conn._doDisconnect(r),e.Status.CONNFAIL;this.sid||(this.sid=t.getAttribute("sid"));var s=t.getAttribute("requests");s&&(this.window=parseInt(s,10));var o=t.getAttribute("hold");o&&(this.hold=parseInt(o,10));var u=t.getAttribute("wait");u&&(this.wait=parseInt(u,10))},_disconnect:function(e){this._sendTerminate(e)},_doDisconnect:function(){this.sid=null,this.rid=Math.floor(Math.random()*4294967295),window.sessionStorage.removeItem("strophe-bosh-session"),this._conn.nextValidRid(this.rid)},_emptyQueue:function(){return this._requests.length===0},_hitError:function(t){this.errors++,e.warn("request errored, status: "+t+", number of errors: "+this.errors),this.errors>4&&this._conn._onDisconnectTimeout()},_no_auth_received:function(t){t?t=t.bind(this._conn):t=this._conn._connect_cb.bind(this._conn);var n=this._buildBody();this._requests.push(new e.Request(n.tree(),this._onRequestStateChange.bind(this,t.bind(this._conn)),n.tree().getAttribute("rid"))),this._throttledRequestHandler()},_onDisconnectTimeout:function(){this._abortAllRequests()},_abortAllRequests:function(){var t;while(this._requests.length>0)t=this._requests.pop(),t.abort=!0,t.xhr.abort(),t.xhr.onreadystatechange=function(){}},_onIdle:function(){var t=this._conn._data;this._conn.authenticated&&this._requests.length===0&&t.length===0&&!this._conn.disconnecting&&(e.info("no requests during idle cycle, sending blank request"),t.push(null));if(this._conn.paused)return;if(this._requests.length<2&&t.length>0){var n=this._buildBody();for(var r=0;r<t.length;r++)t[r]!==null&&(t[r]==="restart"?n.attrs({to:this._conn.domain,"xml:lang":"en","xmpp:restart":"true","xmlns:xmpp":e.NS.BOSH}):n.cnode(t[r]).up());delete this._conn._data,this._conn._data=[],this._requests.push(new e.Request(n.tree(),this._onRequestStateChange.bind(this,this._conn._dataRecv.bind(this._conn)),n.tree().getAttribute("rid"))),this._throttledRequestHandler()}if(this._requests.length>0){var i=this._requests[0].age();this._requests[0].dead!==null&&this._requests[0].timeDead()>Math.floor(e.SECONDARY_TIMEOUT*this.wait)&&this._throttledRequestHandler(),i>Math.floor(e.TIMEOUT*this.wait)&&(e.warn("Request "+this._requests[0].id+" timed out, over "+Math.floor(e.TIMEOUT*this.wait)+" seconds since last activity"),this._throttledRequestHandler())}},_onRequestStateChange:function(t,n){e.debug("request id "+n.id+"."+n.sends+" state changed to "+n.xhr.readyState);if(n.abort){n.abort=!1;return}var r;if(n.xhr.readyState==4){r=0;try{r=n.xhr.status}catch(i){}typeof r=="undefined"&&(r=0);if(this.disconnecting&&r>=400){this._hitError(r);return}var s=this._requests[0]==n,o=this._requests[1]==n;if(r>0&&r<500||n.sends>5)this._removeRequest(n),e.debug("request id "+n.id+" should now be removed");if(r==200)(o||s&&this._requests.length>0&&this._requests[0].age()>Math.floor(e.SECONDARY_TIMEOUT*this.wait))&&this._restartRequest(0),this._conn.nextValidRid(Number(n.rid)+1),e.debug("request id "+n.id+"."+n.sends+" got 200"),t(n),this.errors=0;else{e.error("request id "+n.id+"."+n.sends+" error "+r+" happened");if(r===0||r>=400&&r<600||r>=12e3)this._hitError(r),r>=400&&r<500&&(this._conn._changeConnectStatus(e.Status.DISCONNECTING,null),this._conn._doDisconnect())}r>0&&r<500||n.sends>5||this._throttledRequestHandler()}},_processRequest:function(t){var n=this,r=this._requests[t],i=-1;try{r.xhr.readyState==4&&(i=r.xhr.status)}catch(s){e.error("caught an error in _requests["+t+"], reqStatus: "+i)}typeof i=="undefined"&&(i=-1);if(r.sends>this._conn.maxRetries){this._conn._onDisconnectTimeout();return}var o=r.age(),u=!isNaN(o)&&o>Math.floor(e.TIMEOUT*this.wait),a=r.dead!==null&&r.timeDead()>Math.floor(e.SECONDARY_TIMEOUT*this.wait),f=r.xhr.readyState==4&&(i<1||i>=500);if(u||a||f)a&&e.error("Request "+this._requests[t].id+" timed out (secondary), restarting"),r.abort=!0,r.xhr.abort(),r.xhr.onreadystatechange=function(){},this._requests[t]=new e.Request(r.xmlData,r.origFunc,r.rid,r.sends),r=this._requests[t];if(r.xhr.readyState===0){e.debug("request id "+r.id+"."+r.sends+" posting");try{r.xhr.open("POST",this._conn.service,this._conn.options.sync?!1:!0),r.xhr.setRequestHeader("Content-Type","text/xml; charset=utf-8")}catch(l){e.error("XHR open failed."),this._conn.connected||this._conn._changeConnectStatus(e.Status.CONNFAIL,"bad-service"),this._conn.disconnect();return}var c=function(){r.date=new Date;if(n._conn.options.customHeaders){var e=n._conn.options.customHeaders;for(var t in e)e.hasOwnProperty(t)&&r.xhr.setRequestHeader(t,e[t])}r.xhr.send(r.data)};if(r.sends>1){var h=Math.min(Math.floor(e.TIMEOUT*this.wait),Math.pow(r.sends,3))*1e3;setTimeout(c,h)}else c();r.sends++,this._conn.xmlOutput!==e.Connection.prototype.xmlOutput&&(r.xmlData.nodeName===this.strip&&r.xmlData.childNodes.length?this._conn.xmlOutput(r.xmlData.childNodes[0]):this._conn.xmlOutput(r.xmlData)),this._conn.rawOutput!==e.Connection.prototype.rawOutput&&this._conn.rawOutput(r.data)}else e.debug("_processRequest: "+(t===0?"first":"second")+" request has readyState of "+r.xhr.readyState)},_removeRequest:function(t){e.debug("removing request");var n;for(n=this._requests.length-1;n>=0;n--)t==this._requests[n]&&this._requests.splice(n,1);t.xhr.onreadystatechange=function(){},this._throttledRequestHandler()},_restartRequest:function(e){var t=this._requests[e];t.dead===null&&(t.dead=new Date),this._processRequest(e)},_reqToData:function(e){try{return e.getResponse()}catch(t){if(t!="parsererror")throw t;this._conn.disconnect("strophe-parsererror")}},_sendTerminate:function(t){e.info("_sendTerminate was called");var n=this._buildBody().attrs({type:"terminate"});t&&n.cnode(t.tree());var r=new e.Request(n.tree(),this._onRequestStateChange.bind(this,this._conn._dataRecv.bind(this._conn)),n.tree().getAttribute("rid"));this._requests.push(r),this._throttledRequestHandler()},_send:function(){clearTimeout(this._conn._idleTimeout),this._throttledRequestHandler(),this._conn._idleTimeout=setTimeout(this._conn._onIdle.bind(this._conn),100)},_sendRestart:function(){this._throttledRequestHandler(),clearTimeout(this._conn._idleTimeout)},_throttledRequestHandler:function(){this._requests?e.debug("_throttledRequestHandler called with "+this._requests.length+" requests"):e.debug("_throttledRequestHandler called with undefined requests");if(!this._requests||this._requests.length===0)return;this._requests.length>0&&this._processRequest(0),this._requests.length>1&&Math.abs(this._requests[0].rid-this._requests[1].rid)<this.window&&this._processRequest(1)}},e}),function(e,t){if(typeof define!="function"||!define.amd)return t(Strophe,$build);define("strophe-websocket",["strophe-core"],function(e){return t(e.Strophe,e.$build)})}(this,function(e,t){return e.Websocket=function(e){this._conn=e,this.strip="wrapper";var t=e.service;if(t.indexOf("ws:")!==0&&t.indexOf("wss:")!==0){var n="";e.options.protocol==="ws"&&window.location.protocol!=="https:"?n+="ws":n+="wss",n+="://"+window.location.host,t.indexOf("/")!==0?n+=window.location.pathname+t:n+=t,e.service=n}},e.Websocket.prototype={_buildStream:function(){return t("open",{xmlns:e.NS.FRAMING,to:this._conn.domain,version:"1.0"})},_check_streamerror:function(t,n){var r;t.getElementsByTagNameNS?r=t.getElementsByTagNameNS(e.NS.STREAM,"error"):r=t.getElementsByTagName("stream:error");if(r.length===0)return!1;var i=r[0],s="",o="",u="urn:ietf:params:xml:ns:xmpp-streams";for(var a=0;a<i.childNodes.length;a++){var f=i.childNodes[a];if(f.getAttribute("xmlns")!==u)break;f.nodeName==="text"?o=f.textContent:s=f.nodeName}var l="WebSocket stream error: ";return s?l+=s:l+="unknown",o&&(l+=" - "+s),e.error(l),this._conn._changeConnectStatus(n,s),this._conn._doDisconnect(),!0},_reset:function(){return},_connect:function(){this._closeSocket(),this.socket=new WebSocket(this._conn.service,"xmpp"),this.socket.onopen=this._onOpen.bind(this),this.socket.onerror=this._onError.bind(this),this.socket.onclose=this._onClose.bind(this),this.socket.onmessage=this._connect_cb_wrapper.bind(this)},_connect_cb:function(t){var n=this._check_streamerror(t,e.Status.CONNFAIL);if(n)return e.Status.CONNFAIL},_handleStreamStart:function(t){var n=!1,r=t.getAttribute("xmlns");typeof r!="string"?n="Missing xmlns in <open />":r!==e.NS.FRAMING&&(n="Wrong xmlns in <open />: "+r);var i=t.getAttribute("version");return typeof i!="string"?n="Missing version in <open />":i!=="1.0"&&(n="Wrong version in <open />: "+i),n?(this._conn._changeConnectStatus(e.Status.CONNFAIL,n),this._conn._doDisconnect(),!1):!0},_connect_cb_wrapper:function(t){if(t.data.indexOf("<open ")===0||t.data.indexOf("<?xml")===0){var n=t.data.replace(/^(<\?.*?\?>\s*)*/,"");if(n==="")return;var r=(new DOMParser).parseFromString(n,"text/xml").documentElement;this._conn.xmlInput(r),this._conn.rawInput(t.data),this._handleStreamStart(r)&&this._connect_cb(r)}else if(t.data.indexOf("<close ")===0){this._conn.rawInput(t.data),this._conn.xmlInput(t);var i=t.getAttribute("see-other-uri");i?(this._conn._changeConnectStatus(e.Status.REDIRECT,"Received see-other-uri, resetting connection"),this._conn.reset(),this._conn.service=i,this._connect()):(this._conn._changeConnectStatus(e.Status.CONNFAIL,"Received closing stream"),this._conn._doDisconnect())}else{var s=this._streamWrap(t.data),o=(new DOMParser).parseFromString(s,"text/xml").documentElement;this.socket.onmessage=this._onMessage.bind(this),this._conn._connect_cb(o,null,t.data)}},_disconnect:function(n){if(this.socket&&this.socket.readyState!==WebSocket.CLOSED){n&&this._conn.send(n);var r=t("close",{xmlns:e.NS.FRAMING});this._conn.xmlOutput(r);var i=e.serialize(r);this._conn.rawOutput(i);try{this.socket.send(i)}catch(s){e.info("Couldn't send <close /> tag.")}}this._conn._doDisconnect()},_doDisconnect:function(){e.info("WebSockets _doDisconnect was called"),this._closeSocket()},_streamWrap:function(e){return"<wrapper>"+e+"</wrapper>"},_closeSocket:function(){if(this.socket)try{this.socket.close()}catch(e){}this.socket=null},_emptyQueue:function(){return!0},_onClose:function(){this._conn.connected&&!this._conn.disconnecting?(e.error("Websocket closed unexcectedly"),this._conn._doDisconnect()):e.info("Websocket closed")},_no_auth_received:function(t){e.error("Server did not send any auth methods"),this._conn._changeConnectStatus(e.Status.CONNFAIL,"Server did not send any auth methods"),t&&(t=t.bind(this._conn),t()),this._conn._doDisconnect()},_onDisconnectTimeout:function(){},_abortAllRequests:function(){},_onError:function(t){e.error("Websocket error "+t),this._conn._changeConnectStatus(e.Status.CONNFAIL,"The WebSocket connection could not be established was disconnected."),this._disconnect()},_onIdle:function(){var t=this._conn._data;if(t.length>0&&!this._conn.paused){for(var n=0;n<t.length;n++)if(t[n]!==null){var r,i;t[n]==="restart"?r=this._buildStream().tree():r=t[n],i=e.serialize(r),this._conn.xmlOutput(r),this._conn.rawOutput(i),this.socket.send(i)}this._conn._data=[]}},_onMessage:function(t){var n,r,i='<close xmlns="urn:ietf:params:xml:ns:xmpp-framing" />';if(t.data===i){this._conn.rawInput(i),this._conn.xmlInput(t),this._conn.disconnecting||this._conn._doDisconnect();return}if(t.data.search("<open ")===0){n=(new DOMParser).parseFromString(t.data,"text/xml").documentElement;if(!this._handleStreamStart(n))return}else r=this._streamWrap(t.data),n=(new DOMParser).parseFromString(r,"text/xml").documentElement;if(this._check_streamerror(n,e.Status.ERROR))return;if(this._conn.disconnecting&&n.firstChild.nodeName==="presence"&&n.firstChild.getAttribute("type")==="unavailable"){this._conn.xmlInput(n),this._conn.rawInput(e.serialize(n));return}this._conn._dataRecv(n,t.data)},_onOpen:function(){e.info("Websocket open");var t=this._buildStream();this._conn.xmlOutput(t.tree());var n=e.serialize(t);this._conn.rawOutput(n),this.socket.send(n)},_reqToData:function(e){return e},_send:function(){this._conn.flush()},_sendRestart:function(){clearTimeout(this._conn._idleTimeout),this._conn._onIdle.bind(this._conn)()}},e}),define("strophe",["strophe-core","strophe-bosh","strophe-websocket"],function(e){return e}),function(e,t){typeof define=="function"&&define.amd?define("strophe.disco",["strophe"],function(e){return t(e.Strophe,e.$build,e.$iq,e.$msg,e.$pres),e}):t(e.Strophe,e.$build,e.$iq,e.$msg,e.$pres)}(this,function(e,t,n,r,i){e.addConnectionPlugin("disco",{_connection:null,_identities:[],_features:[],_items:[],init:function(t){this._connection=t,this._identities=[],this._features=[],this._items=[],t.addHandler(this._onDiscoInfo.bind(this),e.NS.DISCO_INFO,"iq","get",null,null),t.addHandler(this._onDiscoItems.bind(this),e.NS.DISCO_ITEMS,"iq","get",null,null)},addIdentity:function(e,t,n,r){for(var i=0;i<this._identities.length;i++)if(this._identities[i].category==e&&this._identities[i].type==t&&this._identities[i].name==n&&this._identities[i].lang==r)return!1;return this._identities.push({category:e,type:t,name:n,lang:r}),!0},addFeature:function(e){for(var t=0;t<this._features.length;t++)if(this._features[t]==e)return!1;return this._features.push(e),!0},removeFeature:function(e){for(var t=0;t<this._features.length;t++)if(this._features[t]===e)return this._features.splice(t,1),!0;return!1},addItem:function(e,t,n,r){return n&&!r?!1:(this._items.push({jid:e,name:t,node:n,call_back:r}),!0)},info:function(t,r,i,s,o){var u={xmlns:e.NS.DISCO_INFO};r&&(u.node=r);var a=n({from:this._connection.jid,to:t,type:"get"}).c("query",u);this._connection.sendIQ(a,i,s,o)},items:function(t,r,i,s,o){var u={xmlns:e.NS.DISCO_ITEMS};r&&(u.node=r);var a=n({from:this._connection.jid,to:t,type:"get"}).c("query",u);this._connection.sendIQ(a,i,s,o)},_buildIQResult:function(e,t){var r=e.getAttribute("id"),i=e.getAttribute("from"),s=n({type:"result",id:r});return i!==null&&s.attrs({to:i}),s.c("query",t)},_onDiscoInfo:function(t){var n=t.getElementsByTagName("query")[0].getAttribute("node"),r={xmlns:e.NS.DISCO_INFO},i;n&&(r.node=n);var s=this._buildIQResult(t,r);for(i=0;i<this._identities.length;i++)r={category:this._identities[i].category,type:this._identities[i].type},this._identities[i].name&&(r.name=this._identities[i].name),this._identities[i].lang&&(r["xml:lang"]=this._identities[i].lang),s.c("identity",r).up();for(i=0;i<this._features.length;i++)s.c("feature",{"var":this._features[i]}).up();return this._connection.send(s.tree()),!0},_onDiscoItems:function(t){var n={xmlns:e.NS.DISCO_ITEMS},r=t.getElementsByTagName("query")[0].getAttribute("node"),i,s;if(r){n.node=r,i=[];for(s=0;s<this._items.length;s++)if(this._items[s].node==r){i=this._items[s].call_back(t);break}}else i=this._items;var o=this._buildIQResult(t,n);for(s=0;s<i.length;s++){var u={jid:i[s].jid};i[s].name&&(u.name=i[s].name),i[s].node&&(u.node=i[s].node),o.c("item",u).up()}return this._connection.send(o.tree()),!0}})}),function(e,t){typeof define=="function"&&define.amd?define("strophe.ping",["strophe"],function(e){return t(e.Strophe,e.$build,e.$iq,e.$msg,e.$pres),e}):t(e.Strophe,e.$build,e.$iq,e.$msg,e.$pres)}(this,function(e,t,n,r,i){e.addConnectionPlugin("ping",{_c:null,init:function(t){this._c=t,e.addNamespace("PING","urn:xmpp:ping")},ping:function(t,r,i,s){var o=this._c.getUniqueId("ping"),u=n({type:"get",to:t,id:o}).c("ping",{xmlns:e.NS.PING});this._c.sendIQ(u,r,i,s)},pong:function(e){var t=e.getAttribute("from"),r=e.getAttribute("id"),i=n({type:"result",to:t,id:r});this._c.sendIQ(i)},addPingHandler:function(t){return this._c.addHandler(t,e.NS.PING,"iq","get")}})}),function(e,t){typeof define=="function"&&define.amd?define("strophe.rsm",["strophe"],function(e){return t(e.Strophe,e.$build,e.$iq,e.$msg,e.$pres),e}):t(e.Strophe,e.$build,e.$iq,e.$msg,e.$pres)}(this,function(e,t,n,r,i){e.addNamespace("RSM","http://jabber.org/protocol/rsm"),e.RSM=function(e){this.attribs=["max","first","last","after","before","index","count"];if(typeof e.xml!="undefined")this.fromXMLElement(e.xml);else for(var t=0;t<this.attribs.length;t++){var n=this.attribs[t];this[n]=e[n]}},e.RSM.prototype={toXML:function(){var n=t("set",{xmlns:e.NS.RSM});for(var r=0;r<this.attribs.length;r++){var i=this.attribs[r];typeof this[i]!="undefined"&&(n=n.c(i).t(this[i].toString()).up())}return n.tree()},next:function(t){var n=new e.RSM({max:t,after:this.last});return n},previous:function(t){var n=new e.RSM({max:t,before:this.first});return n},fromXMLElement:function(t){for(var n=0;n<this.attribs.length;n++){var r=this.attribs[n],i=t.getElementsByTagName(r)[0];typeof i!="undefined"&&i!==null&&(this[r]=e.getText(i),r=="first"&&(this.index=i.getAttribute("index")))}}}}),function(e,t){typeof define=="function"&&define.amd?define("strophe.vcard",["strophe"],function(e){return t(e.Strophe,e.$build,e.$iq,e.$msg,e.$pres),e}):t(e.Strophe,e.$build,e.$iq,e.$msg,e.$pres)}(this,function(e,t,n,r,i){var s=function(t,r,i){var s=n(r?{type:t,to:r}:{type:t});return s.c("vCard",{xmlns:e.NS.VCARD}),i&&s.cnode(i),s};e.addConnectionPlugin("vcard",{_connection:null,init:function(t){return this._connection=t,e.addNamespace("VCARD","vcard-temp")},get:function(e,t,n){var r=s("get",t);return this._connection.sendIQ(r,e,n)},set:function(e,t,n,r){var i=s("set",n,t);return this._connection.sendIQ(i,e,r)}})}),function(e,t){if(typeof define=="function"&&define.amd)define("backbone",["underscore","jquery","exports"],function(n,r,i){e.Backbone=t(e,i,n,r)});else if(typeof exports!="undefined"){var n=require("underscore");t(e,exports,n)}else e.Backbone=t(e,{},e._,e.jQuery||e.Zepto||e.ender||e.$)}(this,function(e,t,n,r){var i=e.Backbone,s=[],o=s.push,u=s.slice,a=s.splice;t.VERSION="1.1.2",t.$=r,t.noConflict=function(){return e.Backbone=i,this},t.emulateHTTP=!1,t.emulateJSON=!1;var f=t.Events={on:function(e,t,n){if(!c(this,"on",e,[t,n])||!t)return this;this._events||(this._events={});var r=this._events[e]||(this._events[e]=[]);return r.push({callback:t,context:n,ctx:n||this}),this},once:function(e,t,r){if(!c(this,"once",e,[t,r])||!t)return this;var i=this,s=n.once(function(){i.off(e,s),t.apply(this,arguments)});return s._callback=t,this.on(e,s,r)},off:function(e,t,r){var i,s,o,u,a,f,l,h;if(!this._events||!c(this,"off",e,[t,r]))return this;if(!e&&!t&&!r)return this._events=void 0,this;u=e?[e]:n.keys(this._events);for(a=0,f=u.length;a<f;a++){e=u[a];if(o=this._events[e]){this._events[e]=i=[];if(t||r)for(l=0,h=o.length;l<h;l++)s=o[l],(t&&t!==s.callback&&t!==s.callback._callback||r&&r!==s.context)&&i.push(s);i.length||delete this._events[e]}}return this},trigger:function(e){if(!this._events)return this;var t=u.call(arguments,1);if(!c(this,"trigger",e,t))return this;var n=this._events[e],r=this._events.all;return n&&h(n,t),r&&h(r,arguments),this},stopListening:function(e,t,r){var i=this._listeningTo;if(!i)return this;var s=!t&&!r;!r&&typeof t=="object"&&(r=this),e&&((i={})[e._listenId]=e);for(var o in i)e=i[o],e.off(t,r,this),(s||n.isEmpty(e._events))&&delete this._listeningTo[o];return this}},l=/\s+/,c=function(e,t,n,r){if(!n)return!0;if(typeof n=="object"){for(var i in n)e[t].apply(e,[i,n[i]].concat(r));return!1}if(l.test(n)){var s=n.split(l);for(var o=0,u=s.length;o<u;o++)e[t].apply(e,[s[o]].concat(r));return!1}return!0},h=function(e,t){var n,r=-1,i=e.length,s=t[0],o=t[1],u=t[2];switch(t.length){case 0:while(++r<i)(n=e[r]).callback.call(n.ctx);return;case 1:while(++r<i)(n=e[r]).callback.call(n.ctx,s);return;case 2:while(++r<i)(n=e[r]).callback.call(n.ctx,s,o);return;case 3:while(++r<i)(n=e[r]).callback.call(n.ctx,s,o,u);return;default:while(++r<i)(n=e[r]).callback.apply(n.ctx,t);return}},p={listenTo:"on",listenToOnce:"once"};n.each(p,function(e,t){f[t]=function(t,r,i){var s=this._listeningTo||(this._listeningTo={}),o=t._listenId||(t._listenId=n.uniqueId("l"));return s[o]=t,!i&&typeof r=="object"&&(i=this),t[e](r,i,this),this}}),f.bind=f.on,f.unbind=f.off,n.extend(t,f);var d=t.Model=function(e,t){var r=e||{};t||(t={}),this.cid=n.uniqueId("c"),this.attributes={},t.collection&&(this.collection=t.collection),t.parse&&(r=this.parse(r,t)||{}),r=n.defaults({},r,n.result(this,"defaults")),this.set(r,t),this.changed={},this.initialize.apply(this,arguments)};n.extend(d.prototype,f,{changed:null,validationError:null,idAttribute:"id",initialize:function(){},toJSON:function(e){return n.clone(this.attributes)},sync:function(){return t.sync.apply(this,arguments)},get:function(e){return this.attributes[e]},escape:function(e){return n.escape(this.get(e))},has:function(e){return this.get(e)!=null},set:function(e,t,r){var i,s,o,u,a,f,l,c;if(e==null)return this;typeof e=="object"?(s=e,r=t):(s={})[e]=t,r||(r={});if(!this._validate(s,r))return!1;o=r.unset,a=r.silent,u=[],f=this._changing,this._changing=!0,f||(this._previousAttributes=n.clone(this.attributes),this.changed={}),c=this.attributes,l=this._previousAttributes,this.idAttribute in s&&(this.id=s[this.idAttribute]);for(i in s)t=s[i],n.isEqual(c[i],t)||u.push(i),n.isEqual(l[i],t)?delete this.changed[i]:this.changed[i]=t,o?delete c[i]:c[i]=t;if(!a){u.length&&(this._pending=r);for(var h=0,p=u.length;h<p;h++)this.trigger("change:"+u[h],this,c[u[h]],r)}if(f)return this;if(!a)while(this._pending)r=this._pending,this._pending=!1,this.trigger("change",this,r);return this._pending=!1,this._changing=!1,this},unset:function(e,t){return this.set(e,void 0,n.extend({},t,{unset:!0}))},clear:function(e){var t={};for(var r in this.attributes)t[r]=void 0;return this.set(t,n.extend({},e,{unset:!0}))},hasChanged:function(e){return e==null?!n.isEmpty(this.changed):n.has(this.changed,e)},changedAttributes:function(e){if(!e)return this.hasChanged()?n.clone(this.changed):!1;var t,r=!1,i=this._changing?this._previousAttributes:this.attributes;for(var s in e){if(n.isEqual(i[s],t=e[s]))continue;(r||(r={}))[s]=t}return r},previous:function(e){return e==null||!this._previousAttributes?null:this._previousAttributes[e]},previousAttributes:function(){return n.clone(this._previousAttributes)},fetch:function(e){e=e?n.clone(e):{},e.parse===void 0&&(e.parse=!0);var t=this,r=e.success;return e.success=function(n){if(!t.set(t.parse(n,e),e))return!1;r&&r(t,n,e),t.trigger("sync",t,n,e)},I(this,e),this.sync("read",this,e)},save:function(e,t,r){var i,s,o,u=this.attributes;e==null||typeof e=="object"?(i=e,r=t):(i={})[e]=t,r=n.extend({validate:!0},r);if(i&&!r.wait){if(!this.set(i,r))return!1}else if(!this._validate(i,r))return!1;i&&r.wait&&(this.attributes=n.extend({},u,i)),r.parse===void 0&&(r.parse=!0);var a=this,f=r.success;return r.success=function(e){a.attributes=u;var t=a.parse(e,r);r.wait&&(t=n.extend(i||{},t));if(n.isObject(t)&&!a.set(t,r))return!1;f&&f(a,e,r),a.trigger("sync",a,e,r)},I(this,r),s=this.isNew()?"create":r.patch?"patch":"update",s==="patch"&&(r.attrs=i),o=this.sync(s,this,r),i&&r.wait&&(this.attributes=u),o},destroy:function(e){e=e?n.clone(e):{};var t=this,r=e.success,i=function(){t.trigger("destroy",t,t.collection,e)};e.success=function(n){(e.wait||t.isNew())&&i(),r&&r(t,n,e),t.isNew()||t.trigger("sync",t,n,e)};if(this.isNew())return e.success(),!1;I(this,e);var s=this.sync("delete",this,e);return e.wait||i(),s},url:function(){var e=n.result(this,"urlRoot")||n.result(this.collection,"url")||F();return this.isNew()?e:e.replace(/([^\/])$/,"$1/")+encodeURIComponent(this.id)},parse:function(e,t){return e},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return!this.has(this.idAttribute)},isValid:function(e){return this._validate({},n.extend(e||{},{validate:!0}))},_validate:function(e,t){if(!t.validate||!this.validate)return!0;e=n.extend({},this.attributes,e);var r=this.validationError=this.validate(e,t)||null;return r?(this.trigger("invalid",this,r,n.extend(t,{validationError:r})),!1):!0}});var v=["keys","values","pairs","invert","pick","omit"];n.each(v,function(e){d.prototype[e]=function(){var t=u.call(arguments);return t.unshift(this.attributes),n[e].apply(n,t)}});var m=t.Collection=function(e,t){t||(t={}),t.model&&(this.model=t.model),t.comparator!==void 0&&(this.comparator=t.comparator),this._reset(),this.initialize.apply(this,arguments),e&&this.reset(e,n.extend({silent:!0},t))},g={add:!0,remove:!0,merge:!0},y={add:!0,remove:!1};n.extend(m.prototype,f,{model:d,initialize:function(){},toJSON:function(e){return this.map(function(t){return t.toJSON(e)})},sync:function(){return t.sync.apply(this,arguments)},add:function(e,t){return this.set(e,n.extend({merge:!1},t,y))},remove:function(e,t){var r=!n.isArray(e);e=r?[e]:n.clone(e),t||(t={});var i,s,o,u;for(i=0,s=e.length;i<s;i++){u=e[i]=this.get(e[i]);if(!u)continue;delete this._byId[u.id],delete this._byId[u.cid],o=this.indexOf(u),this.models.splice(o,1),this.length--,t.silent||(t.index=o,u.trigger("remove",u,this,t)),this._removeReference(u,t)}return r?e[0]:e},set:function(e,t){t=n.defaults({},t,g),t.parse&&(e=this.parse(e,t));var r=!n.isArray(e);e=r?e?[e]:[]:n.clone(e);var i,s,o,u,a,f,l,c=t.at,h=this.model,p=this.comparator&&c==null&&t.sort!==!1,v=n.isString(this.comparator)?this.comparator:null,m=[],y=[],b={},w=t.add,E=t.merge,S=t.remove,x=!p&&w&&S?[]:!1;for(i=0,s=e.length;i<s;i++){a=e[i]||{},a instanceof d?o=u=a:o=a[h.prototype.idAttribute||"id"];if(f=this.get(o))S&&(b[f.cid]=!0),E&&(a=a===u?u.attributes:a,t.parse&&(a=f.parse(a,t)),f.set(a,t),p&&!l&&f.hasChanged(v)&&(l=!0)),e[i]=f;else if(w){u=e[i]=this._prepareModel(a,t);if(!u)continue;m.push(u),this._addReference(u,t)}u=f||u,x&&(u.isNew()||!b[u.id])&&x.push(u),b[u.id]=!0}if(S){for(i=0,s=this.length;i<s;++i)b[(u=this.models[i]).cid]||y.push(u);y.length&&this.remove(y,t)}if(m.length||x&&x.length){p&&(l=!0),this.length+=m.length;if(c!=null)for(i=0,s=m.length;i<s;i++)this.models.splice(c+i,0,m[i]);else{x&&(this.models.length=0);var T=x||m;for(i=0,s=T.length;i<s;i++)this.models.push(T[i])}}l&&this.sort({silent:!0});if(!t.silent){for(i=0,s=m.length;i<s;i++)(u=m[i]).trigger("add",u,this,t);(l||x&&x.length)&&this.trigger("sort",this,t)}return r?e[0]:e},reset:function(e,t){t||(t={});for(var r=0,i=this.models.length;r<i;r++)this._removeReference(this.models[r],t);return t.previousModels=this.models,this._reset(),e=this.add(e,n.extend({silent:!0},t)),t.silent||this.trigger("reset",this,t),e},push:function(e,t){return this.add(e,n.extend({at:this.length},t))},pop:function(e){var t=this.at(this.length-1);return this.remove(t,e),t},unshift:function(e,t){return this.add(e,n.extend({at:0},t))},shift:function(e){var t=this.at(0);return this.remove(t,e),t},slice:function(){return u.apply(this.models,arguments)},get:function(e){return e==null?void 0:this._byId[e]||this._byId[e.id]||this._byId[e.cid]},at:function(e){return this.models[e]},where:function(e,t){return n.isEmpty(e)?t?void 0:[]:this[t?"find":"filter"](function(t){for(var n in e)if(e[n]!==t.get(n))return!1;return!0})},findWhere:function(e){return this.where(e,!0)},sort:function(e){if(!this.comparator)throw new Error("Cannot sort a set without a comparator");return e||(e={}),n.isString(this.comparator)||this.comparator.length===1?this.models=this.sortBy(this.comparator,this):this.models.sort(n.bind(this.comparator,this)),e.silent||this.trigger("sort",this,e),this},pluck:function(e){return n.invoke(this.models,"get",e)},fetch:function(e){e=e?n.clone(e):{},e.parse===void 0&&(e.parse=!0);var t=e.success,r=this;return e.success=function(n){var i=e.reset?"reset":"set";r[i](n,e),t&&t(r,n,e),r.trigger("sync",r,n,e)},I(this,e),this.sync("read",this,e)},create:function(e,t){t=t?n.clone(t):{};if(!(e=this._prepareModel(e,t)))return!1;t.wait||this.add(e,t);var r=this,i=t.success;return t.success=function(e,n){t.wait&&r.add(e,t),i&&i(e,n,t)},e.save(null,t),e},parse:function(e,t){return e},clone:function(){return new this.constructor(this.models)},_reset:function(){this.length=0,this.models=[],this._byId={}},_prepareModel:function(e,t){if(e instanceof d)return e;t=t?n.clone(t):{},t.collection=this;var r=new this.model(e,t);return r.validationError?(this.trigger("invalid",this,r.validationError,t),!1):r},_addReference:function(e,t){this._byId[e.cid]=e,e.id!=null&&(this._byId[e.id]=e),e.collection||(e.collection=this),e.on("all",this._onModelEvent,this)},_removeReference:function(e,t){this===e.collection&&delete e.collection,e.off("all",this._onModelEvent,this)},_onModelEvent:function(e,t,n,r){if((e==="add"||e==="remove")&&n!==this)return;e==="destroy"&&this.remove(t,r),t&&e==="change:"+t.idAttribute&&(delete this._byId[t.previous(t.idAttribute)],t.id!=null&&(this._byId[t.id]=t)),this.trigger.apply(this,arguments)}});var b=["forEach","each","map","collect","reduce","foldl","inject","reduceRight","foldr","find","detect","filter","select","reject","every","all","some","any","include","contains","invoke","max","min","toArray","size","first","head","take","initial","rest","tail","drop","last","without","difference","indexOf","shuffle","lastIndexOf","isEmpty","chain","sample"];n.each(b,function(e){m.prototype[e]=function(){var t=u.call(arguments);return t.unshift(this.models),n[e].apply(n,t)}});var w=["groupBy","countBy","sortBy","indexBy"];n.each(w,function(e){m.prototype[e]=function(t,r){var i=n.isFunction(t)?t:function(e){return e.get(t)};return n[e](this.models,i,r)}});var E=t.View=function(e){this.cid=n.uniqueId("view"),e||(e={}),n.extend(this,n.pick(e,x)),this._ensureElement(),this.initialize.apply(this,arguments),this.delegateEvents()},S=/^(\S+)\s*(.*)$/,x=["model","collection","el","id","attributes","className","tagName","events"];n.extend(E.prototype,f,{tagName:"div",$:function(e){return this.$el.find(e)},initialize:function(){},render:function(){return this},remove:function(){return this.$el.remove(),this.stopListening(),this},setElement:function(e,n){return this.$el&&this.undelegateEvents(),this.$el=e instanceof t.$?e:t.$(e),this.el=this.$el[0],n!==!1&&this.delegateEvents(),this},delegateEvents:function(e){if(!e&&!(e=n.result(this,"events")))return this;this.undelegateEvents();for(var t in e){var r=e[t];n.isFunction(r)||(r=this[e[t]]);if(!r)continue;var i=t.match(S),s=i[1],o=i[2];r=n.bind(r,this),s+=".delegateEvents"+this.cid,o===""?this.$el.on(s,r):this.$el.on(s,o,r)}return this},undelegateEvents:function(){return this.$el.off(".delegateEvents"+this.cid),this},_ensureElement:function(){if(!this.el){var e=n.extend({},n.result(this,"attributes"));this.id&&(e.id=n.result(this,"id")),this.className&&(e["class"]=n.result(this,"className"));var r=t.$("<"+n.result(this,"tagName")+">").attr(e);this.setElement(r,!1)}else this.setElement(n.result(this,"el"),!1)}}),t.sync=function(e,r,i){var s=N[e];n.defaults(i||(i={}),{emulateHTTP:t.emulateHTTP,emulateJSON:t.emulateJSON});var o={type:s,dataType:"json"};i.url||(o.url=n.result(r,"url")||F()),i.data==null&&r&&(e==="create"||e==="update"||e==="patch")&&(o.contentType="application/json",o.data=JSON.stringify(i.attrs||r.toJSON(i))),i.emulateJSON&&(o.contentType="application/x-www-form-urlencoded",o.data=o.data?{model:o.data}:{});if(i.emulateHTTP&&(s==="PUT"||s==="DELETE"||s==="PATCH")){o.type="POST",i.emulateJSON&&(o.data._method=s);var u=i.beforeSend;i.beforeSend=function(e){e.setRequestHeader("X-HTTP-Method-Override",s);if(u)return u.apply(this,arguments)}}o.type!=="GET"&&!i.emulateJSON&&(o.processData=!1),o.type==="PATCH"&&T&&(o.xhr=function(){return new ActiveXObject("Microsoft.XMLHTTP")});var a=i.xhr=t.ajax(n.extend(o,i));return r.trigger("request",r,a,i),a};var T=typeof window!="undefined"&&!!window.ActiveXObject&&(!window.XMLHttpRequest||!(new XMLHttpRequest).dispatchEvent),N={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};t.ajax=function(){return t.$.ajax.apply(t.$,arguments)};var C=t.Router=function(e){e||(e={}),e.routes&&(this.routes=e.routes),this._bindRoutes(),this.initialize.apply(this,arguments)},k=/\((.*?)\)/g,L=/(\(\?)?:\w+/g,A=/\*\w+/g,O=/[\-{}\[\]+?.,\\\^$|#\s]/g;n.extend(C.prototype,f,{initialize:function(){},route:function(e,r,i){n.isRegExp(e)||(e=this._routeToRegExp(e)),n.isFunction(r)&&(i=r,r=""),i||(i=this[r]);var s=this;return t.history.route(e,function(n){var o=s._extractParameters(e,n);s.execute(i,o),s.trigger.apply(s,["route:"+r].concat(o)),s.trigger("route",r,o),t.history.trigger("route",s,r,o)}),this},execute:function(e,t){e&&e.apply(this,t)},navigate:function(e,n){return t.history.navigate(e,n),this},_bindRoutes:function(){if(!this.routes)return;this.routes=n.result(this,"routes");var e,t=n.keys(this.routes);while((e=t.pop())!=null)this.route(e,this.routes[e])},_routeToRegExp:function(e){return e=e.replace(O,"\\$&").replace(k,"(?:$1)?").replace(L,function(e,t){return t?e:"([^/?]+)"}).replace(A,"([^?]*?)"),new RegExp("^"+e+"(?:\\?([\\s\\S]*))?$")},_extractParameters:function(e,t){var r=e.exec(t).slice(1);return n.map(r,function(e,t){return t===r.length-1?e||null:e?decodeURIComponent(e):null})}});var M=t.History=function(){this.handlers=[],n.bindAll(this,"checkUrl"),typeof window!="undefined"&&(this.location=window.location,this.history=window.history)},_=/^[#\/]|\s+$/g,D=/^\/+|\/+$/g,P=/msie [\w.]+/,H=/\/$/,B=/#.*$/;M.started=!1,n.extend(M.prototype,f,{interval:50,atRoot:function(){return this.location.pathname.replace(/[^\/]$/,"$&/")===this.root},getHash:function(e){var t=(e||this).location.href.match(/#(.*)$/);return t?t[1]:""},getFragment:function(e,t){if(e==null)if(this._hasPushState||!this._wantsHashChange||t){e=decodeURI(this.location.pathname+this.location.search);var n=this.root.replace(H,"");e.indexOf(n)||(e=e.slice(n.length))}else e=this.getHash();return e.replace(_,"")},start:function(e){if(M.started)throw new Error("Backbone.history has already been started");M.started=!0,this.options=n.extend({root:"/"},this.options,e),this.root=this.options.root,this._wantsHashChange=this.options.hashChange!==!1,this._wantsPushState=!!this.options.pushState,this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);var r=this.getFragment(),i=document.documentMode,s=P.exec(navigator.userAgent.toLowerCase())&&(!i||i<=7);this.root=("/"+this.root+"/").replace(D,"/");if(s&&this._wantsHashChange){var o=t.$('<iframe src="javascript:0" tabindex="-1">');this.iframe=o.hide().appendTo("body")[0].contentWindow,this.navigate(r)}this._hasPushState?t.$(window).on("popstate",this.checkUrl):this._wantsHashChange&&"onhashchange"in window&&!s?t.$(window).on("hashchange",this.checkUrl):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,this.interval)),this.fragment=r;var u=this.location;if(this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!this.atRoot())return this.fragment=this.getFragment(null,!0),this.location.replace(this.root+"#"+this.fragment),!0;this._hasPushState&&this.atRoot()&&u.hash&&(this.fragment=this.getHash().replace(_,""),this.history.replaceState({},document.title,this.root+this.fragment))}if(!this.options.silent)return this.loadUrl()},stop:function(){t.$(window).off("popstate",this.checkUrl).off("hashchange",this.checkUrl),this._checkUrlInterval&&clearInterval(this._checkUrlInterval),M.started=!1},route:function(e,t){this.handlers.unshift({route:e,callback:t})},checkUrl:function(e){var t=this.getFragment();t===this.fragment&&this.iframe&&(t=this.getFragment(this.getHash(this.iframe)));if(t===this.fragment)return!1;this.iframe&&this.navigate(t),this.loadUrl()},loadUrl:function(e){return e=this.fragment=this.getFragment(e),n.any(this.handlers,function(t){if(t.route.test(e))return t.callback(e),!0})},navigate:function(e,t){if(!M.started)return!1;if(!t||t===!0)t={trigger:!!t};var n=this.root+(e=this.getFragment(e||""));e=e.replace(B,"");if(this.fragment===e)return;this.fragment=e,e===""&&n!=="/"&&(n=n.slice(0,-1));if(this._hasPushState)this.history[t.replace?"replaceState":"pushState"]({},document.title,n);else{if(!this._wantsHashChange)return this.location.assign(n);this._updateHash(this.location,e,t.replace),this.iframe&&e!==this.getFragment(this.getHash(this.iframe))&&(t.replace||this.iframe.document.open().close(),this._updateHash(this.iframe.location,e,t.replace))}if(t.trigger)return this.loadUrl(e)},_updateHash:function(e,t,n){if(n){var r=e.href.replace(/(javascript:|#).*$/,"");e.replace(r+"#"+t)}else e.hash="#"+t}}),t.history=new M;var j=function(e,t){var r=this,i;e&&n.has(e,"constructor")?i=e.constructor:i=function(){return r.apply(this,arguments)},n.extend(i,r,t);var s=function(){this.constructor=i};return s.prototype=r.prototype,i.prototype=new s,e&&n.extend(i.prototype,e),i.__super__=r.prototype,i};d.extend=m.extend=C.extend=E.extend=M.extend=j;var F=function(){throw new Error('A "url" property or function must be specified')},I=function(e,t){var n=t.error;t.error=function(r){n&&n(e,r,t),e.trigger("error",e,r,t)}};return t}),function(e,t){typeof exports=="object"&&typeof require=="function"?module.exports=t(require("backbone"),require("underscore")):typeof define=="function"&&define.amd?define("backbone.browserStorage",["backbone","underscore"],function(n,r){return t(n||e.Backbone,r||e._)}):t(Backbone,_)}(this,function(e,t){function n(){return((1+Math.random())*65536|0).toString(16).substring(1)}function r(){return n()+n()+"-"+n()+"-"+n()+"-"+n()+"-"+n()+n()+n()}function i(e,t){var n=e.length;while(n--)if(e[n]===t)return!0;return!1}function s(e,t){for(var n in t)e[n]=t[n];return e}function o(e,n,r){var i;if(r==="local"&&!window.localStorage)throw"Backbone.browserStorage: Environment does not support localStorage.";if(r==="session"&&!window.sessionStorage)throw"Backbone.browserStorage: Environment does not support sessionStorage.";this.name=e,this.serializer=n||{serialize:function(e){return t.isObject(e)?JSON.stringify(e):e},deserialize:function(e){return e&&JSON.parse(e)}};if(r==="session")this.store=window.sessionStorage;else{if(r!=="local")throw"Backbone.browserStorage: No storage type was specified";this.store=window.localStorage}i=this.store.getItem(this.name),this.records=i&&i.split(",")||[]}e.BrowserStorage={local:function(e,t){return o.bind(this,e,t,"local")()},session:function(e,t){return o.bind(this,e,t,"session")()}};var u={save:function(){this.store.setItem(this.name,this.records.join(","))},create:function(e){return e.id||(e.id=r(),e.set(e.idAttribute,e.id)),this.store.setItem(this._itemName(e.id),this.serializer.serialize(e)),this.records.push(e.id.toString()),this.save(),this.find(e)!==!1},update:function(e){this.store.setItem(this._itemName(e.id),this.serializer.serialize(e));var t=e.id.toString();return i(this.records,t)||(this.records.push(t),this.save()),this.find(e)!==!1},find:function(e){return this.serializer.deserialize(this.store.getItem(this._itemName(e.id)))},findAll:function(){var e=[];for(var t=0,n,r;t<this.records.length;t++)n=this.records[t],r=this.serializer.deserialize(this.store.getItem(this._itemName(n))),r!==null&&e.push(r);return e},destroy:function(e){this.store.removeItem(this._itemName(e.id));var t=e.id.toString();for(var n=0,r;n<this.records.length;n++)this.records[n]===t&&this.records.splice(n,1);return this.save(),e},browserStorage:function(){return{session:sessionStorage,local:localStorage}},_clear:function(){var e=this.store,t=new RegExp("^"+this.name+"-");e.removeItem(this.name);for(var n in e)t.test(n)&&e.removeItem(n);this.records.length=0},_storageSize:function(){return this.store.length},_itemName:function(e){return this.name+"-"+e}};return s(e.BrowserStorage.session.prototype,u),s(e.BrowserStorage.local.prototype,u),e.BrowserStorage.sync=e.localSync=function(t,n,r){var i=n.browserStorage||n.collection.browserStorage,s,o,u=e.$?e.$.Deferred&&e.$.Deferred():e.Deferred&&e.Deferred();try{switch(t){case"read":s=n.id!==undefined?i.find(n):i.findAll();break;case"create":s=i.create(n);break;case"update":s=i.update(n);break;case"delete":s=i.destroy(n)}}catch(a){a.code===22&&i._storageSize()===0?o="Private browsing is unsupported":o=a.message}return s?(r&&r.success&&(e.VERSION==="0.9.10"?r.success(n,s,r):r.success(s)),u&&u.resolve(s)):(o=o?o:"Record Not Found",r&&r.error&&(e.VERSION==="0.9.10"?r.error(n,o,r):r.error(o)),u&&u.reject(o)),r&&r.complete&&r.complete(s),u&&u.promise()},e.ajaxSync=e.sync,e.getSyncMethod=function(t){return t.browserStorage||t.collection&&t.collection.browserStorage?e.localSync:e.ajaxSync},e.sync=function(t,n,r){return e.getSyncMethod(n).apply(this,[t,n,r])},e.BrowserStorage}),function(e,t){typeof define=="function"&&define.amd?define("backbone.overview",["underscore","backbone"],t):t(_||e._,Backbone||e.Backbone)}(this,function(e,t){"use strict";var n=t.Overview=function(n){this.views={},this.keys=e.partial(e.keys,this.views),this.getAll=e.partial(e.identity,this.views),this.get=function(e){return this.views[e]}.bind(this),this.add=function(e,t){return this.views[e]=t,t}.bind(this),this.remove=function(e){typeof e=="undefined"&&(new t.View).remove.apply(this);var n=this.views[e];if(n)return delete this.views[e],n.remove(),n}.bind(this),this.removeAll=function(){e.each(e.keys(this.views),this.remove)}.bind(this),t.View.apply(this,Array.prototype.slice.apply(arguments))},r=["forEach","each","map","collect","reduce","foldl","inject","reduceRight","foldr","find","detect","filter","select","reject","every","all","some","any","include","contains","invoke","max","min","toArray","size","first","head","take","initial","rest","tail","drop","last","without","difference","indexOf","shuffle","lastIndexOf","isEmpty","chain","sample"];return e.each(r,function(t){n.prototype[t]=function(){var n=Array.prototype.slice.call(arguments);return n.unshift(this.views),e[t].apply(e,n)}}),e.extend(n.prototype,t.View.prototype),n.extend=t.View.extend,t.Overview}),function(e,t){typeof define=="function"&&define.amd?define("typeahead",["jquery"],function(n){t(n,e)}):t(jQuery,e)}(this,function(e,t){var n=function(){"use strict";return{isMsie:function(){return/(msie|trident)/i.test(navigator.userAgent)?navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2]:!1},isBlankString:function(e){return!e||/^\s*$/.test(e)},escapeRegExChars:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isString:function(e){return typeof e=="string"},isNumber:function(e){return typeof e=="number"},isArray:e.isArray,isFunction:e.isFunction,isObject:e.isPlainObject,isUndefined:function(e){return typeof e=="undefined"},toStr:function(t){return n.isUndefined(t)||t===null?"":t+""},bind:e.proxy,each:function(t,n){function r(e,t){return n(t,e)}e.each(t,r)},map:e.map,filter:e.grep,every:function(t,n){var r=!0;return t?(e.each(t,function(e,i){if(!(r=n.call(null,i,e,t)))return!1}),!!r):r},some:function(t,n){var r=!1;return t?(e.each(t,function(e,i){if(r=n.call(null,i,e,t))return!1}),!!r):r},mixin:e.extend,getUniqueId:function(){var e=0;return function(){return e++}}(),templatify:function(n){function r(){return String(n)}return e.isFunction(n)?n:r},defer:function(e){setTimeout(e,0)},debounce:function(e,t,n){var r,i;return function(){var s=this,o=arguments,u,a;return u=function(){r=null,n||(i=e.apply(s,o))},a=n&&!r,clearTimeout(r),r=setTimeout(u,t),a&&(i=e.apply(s,o)),i}},throttle:function(e,t){var n,r,i,s,o,u;return o=0,u=function(){o=new Date,i=null,s=e.apply(n,r)},function(){var a=new Date,f=t-(a-o);return n=this,r=arguments,f<=0?(clearTimeout(i),i=null,o=a,s=e.apply(n,r)):i||(i=setTimeout(u,f)),s}},noop:function(){}}}(),r=function(){return{wrapper:'<span class="twitter-typeahead"></span>',dropdown:'<span class="tt-dropdown-menu"></span>',dataset:'<div class="tt-dataset-%CLASS%"></div>',suggestions:'<span class="tt-suggestions"></span>',suggestion:'<div class="tt-suggestion"></div>'}}(),i=function(){"use strict";var e={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},dropdown:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},suggestions:{display:"block"},suggestion:{whiteSpace:"nowrap",cursor:"pointer"},suggestionChild:{whiteSpace:"normal"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:" 0"}};return n.isMsie()&&n.mixin(e.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),n.isMsie()&&n.isMsie()<=7&&n.mixin(e.input,{marginTop:"-1px"}),e}(),s=function(){"use strict";function r(t){(!t||!t.el)&&e.error("EventBus initialized without el"),this.$el=e(t.el)}var t="typeahead:";return n.mixin(r.prototype,{trigger:function(e){var n=[].slice.call(arguments,1);this.$el.trigger(t+e,n)}}),r}(),o=function(){"use strict";function r(t,n,r,i){var s;if(!r)return this;n=n.split(e),r=i?l(r,i):r,this._callbacks=this._callbacks||{};while(s=n.shift())this._callbacks[s]=this._callbacks[s]||{sync:[],async:[]},this._callbacks[s][t].push(r);return this}function i(e,t,n){return r.call(this,"async",e,t,n)}function s(e,t,n){return r.call(this,"sync",e,t,n)}function o(t){var n;if(!this._callbacks)return this;t=t.split(e);while(n=t.shift())delete this._callbacks[n];return this}function u(t){var r,i,s,o,u;if(!this._callbacks)return this;t=t.split(e),s=[].slice.call(arguments,1);while((r=t.shift())&&(i=this._callbacks[r]))o=a(i.sync,this,[r].concat(s)),u=a(i.async,this,[r].concat(s)),o()&&n(u);return this}function a(e,t,n){function r(){var r;for(var i=0,s=e.length;!r&&i<s;i+=1)r=e[i].apply(t,n)===!1;return!r}return r}function f(){var e;return t.setImmediate?e=function(t){setImmediate(function(){t()})}:e=function(t){setTimeout(function(){t()},0)},e}function l(e,t){return e.bind?e.bind(t):function(){e.apply(t,[].slice.call(arguments,0))}}var e=/\s+/,n=f();return{onSync:s,onAsync:i,off:o,trigger:u}}(),u=function(e){"use strict";function r(e,t,r){var i=[],s;for(var o=0,u=e.length;o<u;o++)i.push(n.escapeRegExChars(e[o]));return s=r?"\\b("+i.join("|")+")\\b":"("+i.join("|")+")",t?new RegExp(s):new RegExp(s,"i")}var t={node:null,pattern:null,tagName:"strong",className:null,wordsOnly:!1,caseSensitive:!1};return function(s){function u(t){var n,r,i;if(n=o.exec(t.data))i=e.createElement(s.tagName),s.className&&(i.className=s.className),r=t.splitText(n.index),r.splitText(n[0].length),i.appendChild(r.cloneNode(!0)),t.parentNode.replaceChild(i,r);return!!n}function a(e,t){var n,r=3;for(var i=0;i<e.childNodes.length;i++)n=e.childNodes[i],n.nodeType===r?i+=t(n)?1:0:a(n,t)}var o;s=n.mixin({},t,s);if(!s.node||!s.pattern)return;s.pattern=n.isArray(s.pattern)?s.pattern:[s.pattern],o=r(s.pattern,s.caseSensitive,s.wordsOnly),a(s.node,u)}}(t.document),a=function(){"use strict";function r(r){var s=this,o,u,a,f;r=r||{},r.input||e.error("input is missing"),o=n.bind(this._onBlur,this),u=n.bind(this._onFocus,this),a=n.bind(this._onKeydown,this),f=n.bind(this._onInput,this),this.$hint=e(r.hint),this.$input=e(r.input).on("blur.tt",o).on("focus.tt",u).on("keydown.tt",a),this.$hint.length===0&&(this.setHint=this.getHint=this.clearHint=this.clearHintIfInvalid=n.noop),n.isMsie()?this.$input.on("keydown.tt keypress.tt cut.tt paste.tt",function(e){if(t[e.which||e.keyCode])return;n.defer(n.bind(s._onInput,s,e))}):this.$input.on("input.tt",f),this.query=this.$input.val(),this.$overflowHelper=i(this.$input)}function i(t){return e('<pre aria-hidden="true"></pre>').css({position:"absolute",visibility:"hidden",whiteSpace:"pre",fontFamily:t.css("font-family"),fontSize:t.css("font-size"),fontStyle:t.css("font-style"),fontVariant:t.css("font-variant"),fontWeight:t.css("font-weight"),wordSpacing:t.css("word-spacing"),letterSpacing:t.css("letter-spacing"),textIndent:t.css("text-indent"),textRendering:t.css("text-rendering"),textTransform:t.css("text-transform")}).insertAfter(t)}function s(e,t){return r.normalizeQuery(e)===r.normalizeQuery(t)}function u(e){return e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}var t;return t={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"},r.normalizeQuery=function(e){return(e||"").replace(/^\s*/g,"").replace(/\s{2,}/g," ")},n.mixin(r.prototype,o,{_onBlur:function(){this.resetInputValue(),this.trigger("blurred")},_onFocus:function(){this.trigger("focused")},_onKeydown:function(n){var r=t[n.which||n.keyCode];this._managePreventDefault(r,n),r&&this._shouldTrigger(r,n)&&this.trigger(r+"Keyed",n)},_onInput:function(){this._checkInputValue()},_managePreventDefault:function(t,n){var r,i,s;switch(t){case"tab":i=this.getHint(),s=this.getInputValue(),r=i&&i!==s&&!u(n);break;case"up":case"down":r=!u(n);break;default:r=!1}r&&n.preventDefault()},_shouldTrigger:function(t,n){var r;switch(t){case"tab":r=!u(n);break;default:r=!0}return r},_checkInputValue:function(){var t,n,r;t=this.getInputValue(),n=s(t,this.query),r=n?this.query.length!==t.length:!1,this.query=t,n?r&&this.trigger("whitespaceChanged",this.query):this.trigger("queryChanged",this.query)},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getQuery:function(){return this.query},setQuery:function(t){this.query=t},getInputValue:function(){return this.$input.val()},setInputValue:function(t,n){this.$input.val(t),n?this.clearHint():this._checkInputValue()},resetInputValue:function(){this.setInputValue(this.query,!0)},getHint:function(){return this.$hint.val()},setHint:function(t){this.$hint.val(t)},clearHint:function(){this.setHint("")},clearHintIfInvalid:function(){var t,n,r,i;t=this.getInputValue(),n=this.getHint(),r=t!==n&&n.indexOf(t)===0,i=t!==""&&r&&!this.hasOverflow(),!i&&this.clearHint()},getLanguageDirection:function(){return(this.$input.css("direction")||"ltr").toLowerCase()},hasOverflow:function(){var t=this.$input.width()-2;return this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>=t},isCursorAtEnd:function(){var e,t,r;return e=this.$input.val().length,t=this.$input[0].selectionStart,n.isNumber(t)?t===e:document.selection?(r=document.selection.createRange(),r.moveStart("character",-e),e===r.text.length):!0},destroy:function(){this.$hint.off(".tt"),this.$input.off(".tt"),this.$hint=this.$input=this.$overflowHelper=null}}),r}(),f=function(){"use strict";function f(t){t=t||{},t.templates=t.templates||{},t.source||e.error("missing source"),t.name&&!h(t.name)&&e.error("invalid dataset name: "+t.name),this.query=null,this.highlight=!!t.highlight,this.name=t.name||n.getUniqueId(),this.source=t.source,this.displayFn=l(t.display||t.displayKey),this.templates=c(t.templates,this.displayFn),this.$el=e(r.dataset.replace("%CLASS%",this.name))}function l(e){function t(t){return t[e]}return e=e||"value",n.isFunction(e)?e:t}function c(e,t){function r(e){return"<p>"+t(e)+"</p>"}return{empty:e.empty&&n.templatify(e.empty),header:e.header&&n.templatify(e.header),footer:e.footer&&n.templatify(e.footer),suggestion:e.suggestion||r}}function h(e){return/^[_a-zA-Z0-9-]+$/.test(e)}var t="ttDataset",s="ttValue",a="ttDatum";return f.extractDatasetName=function(r){return e(r).data(t)},f.extractValue=function(n){return e(n).data(s)},f.extractDatum=function(n){return e(n).data(a)},n.mixin(f.prototype,o,{_render:function(f,l){function p(){return c.templates.empty({query:f,isEmpty:!0})}function d(){function p(n){var o;return o=e(r.suggestion).append(c.templates.suggestion(n)).data(t,c.name).data(s,c.displayFn(n)).data(a,n),o.children().each(function(){e(this).css(i.suggestionChild)}),o}var o,h;return o=e(r.suggestions).css(i.suggestions),h=n.map(l,p),o.append.apply(o,h),c.highlight&&u({className:"tt-highlight",node:o[0],pattern:f}),o}function v(){return c.templates.header({query:f,isEmpty:!h})}function m(){return c.templates.footer({query:f,isEmpty:!h})}if(!this.$el)return;var c=this,h;this.$el.empty(),h=l&&l.length,!h&&this.templates.empty?this.$el.html(p()).prepend(c.templates.header?v():null).append(c.templates.footer?m():null):h&&this.$el.html(d()).prepend(c.templates.header?v():null).append(c.templates.footer?m():null),this.trigger("rendered")},getRoot:function(){return this.$el},update:function(t){function r(e){!n.canceled&&t===n.query&&n._render(t,e)}var n=this;this.query=t,this.canceled=!1,this.source(t,r)},cancel:function(){this.canceled=!0},clear:function(){this.cancel(),this.$el.empty(),this.trigger("rendered")},isEmpty:function(){return this.$el.is(":empty")},destroy:function(){this.$el=null}}),f}(),l=function(){"use strict";function t(t){var i=this,s,o,u;t=t||{},t.menu||e.error("menu is required"),this.isOpen=!1,this.isEmpty=!0,this.datasets=n.map(t.datasets,r),s=n.bind(this._onSuggestionClick,this),o=n.bind(this._onSuggestionMouseEnter,this),u=n.bind(this._onSuggestionMouseLeave,this),this.$menu=e(t.menu).on("click.tt",".tt-suggestion",s).on("mouseenter.tt",".tt-suggestion",o).on("mouseleave.tt",".tt-suggestion",u),n.each(this.datasets,function(e){i.$menu.append(e.getRoot()),e.onSync("rendered",i._onRendered,i)})}function r(e){return new f(e)}return n.mixin(t.prototype,o,{_onSuggestionClick:function(n){this.trigger("suggestionClicked",e(n.currentTarget))},_onSuggestionMouseEnter:function(n){this._removeCursor(),this._setCursor(e(n.currentTarget),!0)},_onSuggestionMouseLeave:function(){this._removeCursor()},_onRendered:function(){function t(e){return e.isEmpty()}this.isEmpty=n.every(this.datasets,t),this.isEmpty?this._hide():this.isOpen&&this._show(),this.trigger("datasetRendered")},_hide:function(){this.$menu.hide()},_show:function(){this.$menu.css("display","block")},_getSuggestions:function(){return this.$menu.find(".tt-suggestion")},_getCursor:function(){return this.$menu.find(".tt-cursor").first()},_setCursor:function(t,n){t.first().addClass("tt-cursor"),!n&&this.trigger("cursorMoved")},_removeCursor:function(){this._getCursor().removeClass("tt-cursor")},_moveCursor:function(t){var n,r,i,s;if(!this.isOpen)return;r=this._getCursor(),n=this._getSuggestions(),this._removeCursor(),i=n.index(r)+t,i=(i+1)%(n.length+1)-1;if(i===-1){this.trigger("cursorRemoved");return}i<-1&&(i=n.length-1),this._setCursor(s=n.eq(i)),this._ensureVisible(s)},_ensureVisible:function(t){var n,r,i,s;n=t.position().top,r=n+t.outerHeight(!0),i=this.$menu.scrollTop(),s=this.$menu.height()+parseInt(this.$menu.css("paddingTop"),10)+parseInt(this.$menu.css("paddingBottom"),10),n<0?this.$menu.scrollTop(i+n):s<r&&this.$menu.scrollTop(i+(r-s))},close:function(){this.isOpen&&(this.isOpen=!1,this._removeCursor(),this._hide(),this.trigger("closed"))},open:function(){this.isOpen||(this.isOpen=!0,!this.isEmpty&&this._show(),this.trigger("opened"))},setLanguageDirection:function(t){this.$menu.css(t==="ltr"?i.ltr:i.rtl)},moveCursorUp:function(){this._moveCursor(-1)},moveCursorDown:function(){this._moveCursor(1)},getDatumForSuggestion:function(t){var n=null;return t.length&&(n={raw:f.extractDatum(t),value:f.extractValue(t),datasetName:f.extractDatasetName(t)}),n},getDatumForCursor:function(){return this.getDatumForSuggestion(this._getCursor().first())},getDatumForTopSuggestion:function(){return this.getDatumForSuggestion(this._getSuggestions().first())},update:function(t){function r(e){e.update(t)}n.each(this.datasets,r)},empty:function(){function t(e){e.clear()}n.each(this.datasets,t),this.isEmpty=!0},isVisible:function(){return this.isOpen&&!this.isEmpty},destroy:function(){function t(e){e.destroy()}this.$menu.off(".tt"),this.$menu=null,n.each(this.datasets,t)}}),t}(),c=function(){"use strict";function o(t){var r,i,o;t=t||{},t.input||e.error("missing input"),this.isActivated=!1,this.autoselect=!!t.autoselect,this.minLength=n.isNumber(t.minLength)?t.minLength:1,this.$node=u(t.input,t.withHint),r=this.$node.find(".tt-dropdown-menu"),i=this.$node.find(".tt-input"),o=this.$node.find(".tt-hint"),i.on("blur.tt",function(e){var t,s,o;t=document.activeElement,s=r.is(t),o=r.has(t).length>0,n.isMsie()&&(s||o)&&(e.preventDefault(),e.stopImmediatePropagation(),n.defer(function(){i.focus()}))}),r.on("mousedown.tt",function(e){e.preventDefault()}),this.eventBus=t.eventBus||new s({el:i}),this.dropdown=(new l({menu:r,datasets:t.datasets})).onSync("suggestionClicked",this._onSuggestionClicked,this).onSync("cursorMoved",this._onCursorMoved,this).onSync("cursorRemoved",this._onCursorRemoved,this).onSync("opened",this._onOpened,this).onSync("closed",this._onClosed,this).onAsync("datasetRendered",this._onDatasetRendered,this),this.input=(new a({input:i,hint:o})).onSync("focused",this._onFocused,this).onSync("blurred",this._onBlurred,this).onSync("enterKeyed",this._onEnterKeyed,this).onSync("tabKeyed",this._onTabKeyed,this).onSync("escKeyed",this._onEscKeyed,this).onSync("upKeyed",this._onUpKeyed,this).onSync("downKeyed",this._onDownKeyed,this).onSync("leftKeyed",this._onLeftKeyed,this).onSync("rightKeyed",this._onRightKeyed,this).onSync("queryChanged",this._onQueryChanged,this).onSync("whitespaceChanged",this._onWhitespaceChanged,this),this._setLanguageDirection()}function u(n,s){var o,u,a,l;o=e(n),u=e(r.wrapper).css(i.wrapper),a=e(r.dropdown).css(i.dropdown),l=o.clone().css(i.hint).css(f(o)),l.val("").removeData().addClass("tt-hint").removeAttr("id name placeholder required").prop("readonly",!0).attr({autocomplete:"off",spellcheck:"false",tabindex:-1}),o.data(t,{dir:o.attr("dir"),autocomplete:o.attr("autocomplete"),spellcheck:o.attr("spellcheck"),style:o.attr("style")}),o.addClass("tt-input").attr({autocomplete:"off",spellcheck:!1}).css(s?i.input:i.inputWithNoHint);try{!o.attr("dir")&&o.attr("dir","auto")}catch(c){}return o.wrap(u).parent().prepend(s?l:null).append(a)}function f(e){return{backgroundAttachment:e.css("background-attachment"),backgroundClip:e.css("background-clip"),backgroundColor:e.css("background-color"),backgroundImage:e.css("background-image"),backgroundOrigin:e.css("background-origin"),backgroundPosition:e.css("background-position"),backgroundRepeat:e.css("background-repeat"),backgroundSize:e.css("background-size")}}function c(e){var r=e.find(".tt-input");n.each(r.data(t),function(e,t){n.isUndefined(e)?r.removeAttr(t):r.attr(t,e)}),r.detach().removeData(t).removeClass("tt-input").insertAfter(e),e.remove()}var t="ttAttrs";return n.mixin(o.prototype,{_onSuggestionClicked:function(t,n){var r;(r=this.dropdown.getDatumForSuggestion(n))&&this._select(r)},_onCursorMoved:function(){var t=this.dropdown.getDatumForCursor();this.input.setInputValue(t.value,!0),this.eventBus.trigger("cursorchanged",t.raw,t.datasetName)},_onCursorRemoved:function(){this.input.resetInputValue(),this._updateHint()},_onDatasetRendered:function(){this._updateHint()},_onOpened:function(){this._updateHint(),this.eventBus.trigger("opened")},_onClosed:function(){this.input.clearHint(),this.eventBus.trigger("closed")},_onFocused:function(){this.isActivated=!0,this.dropdown.open()},_onBlurred:function(){this.isActivated=!1,this.dropdown.empty(),this.dropdown.close()},_onEnterKeyed:function(t,n){var r,i;r=this.dropdown.getDatumForCursor(),i=this.dropdown.getDatumForTopSuggestion(),r?(this._select(r),n.preventDefault()):this.autoselect&&i&&(this._select(i),n.preventDefault())},_onTabKeyed:function(t,n){var r;(r=this.dropdown.getDatumForCursor())?(this._select(r),n.preventDefault()):this._autocomplete(!0)},_onEscKeyed:function(){this.dropdown.close(),this.input.resetInputValue()},_onUpKeyed:function(){var t=this.input.getQuery();this.dropdown.isEmpty&&t.length>=this.minLength?this.dropdown.update(t):this.dropdown.moveCursorUp(),this.dropdown.open()},_onDownKeyed:function(){var t=this.input.getQuery();this.dropdown.isEmpty&&t.length>=this.minLength?this.dropdown.update(t):this.dropdown.moveCursorDown(),this.dropdown.open()},_onLeftKeyed:function(){this.dir==="rtl"&&this._autocomplete()},_onRightKeyed:function(){this.dir==="ltr"&&this._autocomplete()},_onQueryChanged:function(t,n){this.input.clearHintIfInvalid(),n.length>=this.minLength?this.dropdown.update(n):this.dropdown.empty(),this.dropdown.open(),this._setLanguageDirection()},_onWhitespaceChanged:function(){this._updateHint(),this.dropdown.open()},_setLanguageDirection:function(){var t;this.dir!==(t=this.input.getLanguageDirection())&&(this.dir=t,this.$node.css("direction",t),this.dropdown.setLanguageDirection(t))},_updateHint:function(){var t,r,i,s,o,u;t=this.dropdown.getDatumForTopSuggestion(),t&&this.dropdown.isVisible()&&!this.input.hasOverflow()?(r=this.input.getInputValue(),i=a.normalizeQuery(r),s=n.escapeRegExChars(i),o=new RegExp("^(?:"+s+")(.+$)","i"),u=o.exec(t.value),u?this.input.setHint(r+u[1]):this.input.clearHint()):this.input.clearHint()},_autocomplete:function(t){var n,r,i,s;n=this.input.getHint(),r=this.input.getQuery(),i=t||this.input.isCursorAtEnd(),n&&r!==n&&i&&(s=this.dropdown.getDatumForTopSuggestion(),s&&this.input.setInputValue(s.value),this.eventBus.trigger("autocompleted",s.raw,s.datasetName))},_select:function(t){this.input.setQuery(t.value),this.input.setInputValue(t.value,!0),this._setLanguageDirection(),this.eventBus.trigger("selected",t.raw,t.datasetName),this.dropdown.close(),n.defer(n.bind(this.dropdown.empty,this.dropdown))},open:function(){this.dropdown.open()},close:function(){this.dropdown.close()},setVal:function(t){t=n.toStr(t),this.isActivated?this.input.setInputValue(t):(this.input.setQuery(t),this.input.setInputValue(t,!0)),this._setLanguageDirection()},getVal:function(){return this.input.getQuery()},destroy:function(){this.input.destroy(),this.dropdown.destroy(),c(this.$node),this.$node=null}}),o}();return function(){"use strict";var t,r,i;t=e.fn.typeahead,r="ttTypeahead",i={initialize:function(i,o){function u(){var t=e(this),u,a;n.each(o,function(e){e.highlight=!!i.highlight}),a=new c({input:t,eventBus:u=new s({el:t}),withHint:n.isUndefined(i.hint)?!0:!!i.hint,minLength:i.minLength,autoselect:i.autoselect,datasets:o}),t.data(r,a)}return o=n.isArray(o)?o:[].slice.call(arguments,1),i=i||{},this.each(u)},open:function(){function n(){var t=e(this),n;(n=t.data(r))&&n.open()}return this.each(n)},close:function(){function n(){var t=e(this),n;(n=t.data(r))&&n.close()}return this.each(n)},val:function(n){function i(){var t=e(this),i;(i=t.data(r))&&i.setVal(n)}function s(e){var t,n;if(t=e.data(r))n=t.getVal();return n}return arguments.length?this.each(i):s(this.first())},destroy:function(){function n(){var t=e(this),n;if(n=t.data(r))n.destroy(),t.removeData(r)}return this.each(n)}},e.fn.typeahead=function(t){var n;return i[t]&&t!=="initialize"?(n=this.filter(function(){return!!e(this).data(r)}),i[t].apply(n,[].slice.call(arguments,1))):i.initialize.apply(this,arguments)},e.fn.typeahead.noConflict=function(){return e.fn.typeahead=t,this}}(),{}}),define("converse-dependencies",["jquery","underscore","polyfill","utils","otr","moment_with_locales","strophe","strophe.disco","strophe.ping","strophe.rsm","strophe.vcard","backbone.browserStorage","backbone.overview","jquery.browser","typeahead"],function(e,t,n,r,i,s,o){return t.extend({underscore:t,jQuery:e,otr:i,moment:s,utils:r},o)}),function(e,t){typeof define=="function"&&define.amd?define("converse",["converse-dependencies","converse-templates"],function(e,n){return t(n,e.jQuery,e.$iq,e.$msg,e.$pres,e.$build,e.otr?e.otr.DSA:undefined,e.otr?e.otr.OTR:undefined,e.Strophe,e.underscore,e.moment,e.utils,e.SHA1.b64_sha1)}):e.converse=t(templates,jQuery,$iq,$msg,$pres,$build,DSA,OTR,Strophe,_,moment,utils,b64_sha1)}(this,function(e,t,n,r,i,s,o,u,a,f,l,c,h){f.templateSettings={evaluate:/\{\[([\s\S]+?)\]\}/g,interpolate:/\{\{([\s\S]+?)\}\}/g};var p=function(e,t){return function(n){if(typeof e=="object"){var r=!1;return f.each(e,function(e){r=r||n.get(e).toLowerCase().indexOf(t.toLowerCase())!==-1}),r}if(typeof e=="string")return n.get(e).toLowerCase().indexOf(t.toLowerCase())!==-1;throw new TypeError("contains: wrong attribute type. Must be string or array.")}};p.not=function(e,t){return function(n){return!p(e,t)(n)}};var d={plugins:{},templates:e,emit:function(e,n){t(this).trigger(e,n)},once:function(e,n){t(this).one(e,n)},on:function(e,n){t(this).bind(e,n)},off:function(e,n){t(this).unbind(e,n)},refreshWebkit:function(){if(t.browser.webkit){var e=document.getElementById("conversejs");e.style.display="none",e.offsetHeight=e.offsetHeight,e.style.display="block"}}},v=["max","first","last","after","before","index","count"],m=["with","start","end"],g={offline:6,unavailable:5,xa:4,away:3,dnd:2,chat:1,online:1};d.initialize=function(d,v){"use strict";var m=this,y;"onpagehide"in window?y="pagehide":"onbeforeunload"in window?y="beforeunload":"onunload"in window&&(y="unload"),a.log=function(e,t){m.log(e+" "+t,e)},a.error=function(e){m.log(e,"error")},a.addNamespace("CARBONS","urn:xmpp:carbons:2"),a.addNamespace("CHATSTATES","http://jabber.org/protocol/chatstates"),a.addNamespace("CSI","urn:xmpp:csi:0"),a.addNamespace("MAM","urn:xmpp:mam:0"),a.addNamespace("MUC_ADMIN",a.NS.MUC+"#admin"),a.addNamespace("MUC_OWNER",a.NS.MUC+"#owner"),a.addNamespace("MUC_REGISTER","jabber:iq:register"),a.addNamespace("MUC_ROOMCONF",a.NS.MUC+"#roomconfig"),a.addNamespace("MUC_USER",a.NS.MUC+"#user"),a.addNamespace("REGISTER","jabber:iq:register"),a.addNamespace("ROSTERX","http://jabber.org/protocol/rosterx"),a.addNamespace("RSM","http://jabber.org/protocol/rsm"),a.addNamespace("XFORM","jabber:x:data");var w=0;Object.keys(a.Status).forEach(function(e){w=Math.max(w,a.Status[e])}),a.Status.REGIFAIL=w+1,a.Status.REGISTERED=w+2,a.Status.CONFLICT=w+3,a.Status.NOTACCEPTABLE=w+5;var E="login",S="anonymous",x="prebind",T=0,N=1,C=2,k=3,L={ENTER:13,FORWARD_SLASH:47},A={0:"ERROR",1:"CONNECTING",2:"CONNFAIL",3:"AUTHENTICATING",4:"AUTHFAIL",5:"CONNECTED",6:"DISCONNECTED",7:"DISCONNECTING",8:"ATTACHED",9:"REDIRECT"},O="inactive",M="active",D="composing",P="paused",H="gone";this.TIMEOUTS={PAUSED:2e4,INACTIVE:9e4};var B=typeof crypto!="undefined"&&(typeof crypto.randomBytes=="function"||typeof crypto.getRandomValues=="function"),j=B&&typeof CryptoJS!="undefined"&&typeof u!="undefined"&&typeof o!="undefined",F="opened",I="closed";this.isConverseLocale=function(e){return typeof locales[e]!="undefined"},this.isMomentLocale=function(e){return l.locale()!==l.locale(e)},this.isLocaleAvailable=function(e,t){if(t(e))return e;var n=e.split("-")[0];if(n!==e&&t(n))return n},this.detectLocale=function(e){var t,n;window.navigator.userLanguage&&(t=this.isLocaleAvailable(window.navigator.userLanguage,e));if(window.navigator.languages&&!t)for(n=0;n<window.navigator.languages.length&&!t;n++)t=this.isLocaleAvailable(window.navigator.languages[n],e);return window.navigator.browserLanguage&&!t&&(t=this.isLocaleAvailable(window.navigator.browserLanguage,e)),window.navigator.language&&!t&&(t=this.isLocaleAvailable(window.navigator.language,e)),window.navigator.systemLanguage&&!t&&(t=this.isLocaleAvailable(window.navigator.systemLanguage,e)),t||"en"},l.locale||(l.locale=l.lang),l.locale(this.detectLocale(this.isMomentLocale)),this.i18n=d.i18n?d.i18n:locales[this.detectLocale(this.isConverseLocale)];var q=c.__.bind(this),R=c.___;this.default_settings={allow_chat_pending_contacts:!1,allow_contact_removal:!0,allow_contact_requests:!0,allow_dragresize:!0,allow_logout:!0,allow_muc:!0,allow_otr:!0,archived_messages_page_size:"20",auto_away:0,auto_xa:0,allow_registration:!0,animate:!0,auto_list_rooms:!1,auto_login:!1,auto_reconnect:!1,auto_subscribe:!1,bosh_service_url:undefined,cache_otr_key:!1,csi_waiting_time:0,debug:!1,domain_placeholder:q(" e.g. conversejs.org"),expose_rid_and_sid:!1,forward_messages:!1,hide_muc_server:!1,hide_offline_users:!1,jid:undefined,keepalive:!1,message_archiving:"never",message_carbons:!1,muc_history_max_stanzas:undefined,no_trimming:!1,ping_interval:180,play_sounds:!1,sounds_path:"/sounds/",password:undefined,authentication:"login",prebind:!1,prebind_url:null,providers_link:"https://xmpp.net/directory.php",rid:undefined,roster_groups:!1,show_controlbox_by_default:!1,show_only_online_users:!1,show_toolbar:!0,sid:undefined,storage:"session",use_otr_by_default:!1,use_vcards:!0,visible_toolbar_buttons:{emoticons:!0,call:!1,clear:!0,toggle_occupants:!0},websocket_url:undefined,xhr_custom_status:!1,xhr_custom_status_url:"",xhr_user_search:!1,xhr_user_search_url:""},f.extend(this,this.default_settings),f.extend(this,f.pick(d,Object.keys(this.default_settings))),this.prebind===!0&&(this.authentication=x);if(this.authentication===S&&!this.jid)throw"Config Error: you need to provide the server's domain via the 'jid' option when using anonymous authentication.";d.visible_toolbar_buttons&&f.extend(this.visible_toolbar_buttons,f.pick(d.visible_toolbar_buttons,["emoticons","call","clear","toggle_occupants"])),t.fx.off=!this.animate,this.allow_otr=this.allow_otr&&j,this.use_otr_by_default=this.use_otr_by_default&&this.allow_otr;var U={};U[T]="unencrypted",U[N]="unverified",U[C]="verified",U[k]="finished";var z={};z[T]=q("unencrypted"),z[N]=q("unverified"),z[C]=q("verified"),z[k]=q("finished");var W={dnd:q("This contact is busy"),online:q("This contact is online"),offline:q("This contact is offline"),unavailable:q("This contact is unavailable"),xa:q("This contact is away for an extended period"),away:q("This contact is away")},X=q("Click to hide these contacts"),V=q("My contacts"),J=q("Pending contacts"),K=q("Contact requests"),Q=q("Ungrouped"),G=q("Contacts"),Y=q("Groups"),Z={};Z[V]=0,Z[Q]=1,Z[K]=2,Z[J]=3,this.callback=v||function(){},this.initial_presence_sent=0,this.msg_counter=0,this.sendCSI=function(e){if(m.features[a.NS.CSI]||!0)m.connection.send(s(e,{xmlns:a.NS.CSI})),this.inactive=e===O?!0:!1},this.onUserActivity=function(){this.idle_seconds>0&&(this.idle_seconds=0);if(!m.connection.authenticated)return;this.inactive&&this.sendCSI(M),this.auto_changed_status===!0&&(this.auto_changed_status=!1,this.xmppstatus.setStatus("online"))},this.onEverySecond=function(){if(!m.connection.authenticated)return;var e=this.xmppstatus.getStatus();this.idle_seconds++,this.csi_waiting_time>0&&this.idle_seconds>this.csi_waiting_time&&!this.inactive&&this.sendCSI(O),this.auto_away>0&&this.idle_seconds>this.auto_away&&e!=="away"&&e!=="xa"?(this.auto_changed_status=!0,this.xmppstatus.setStatus("away")):this.auto_xa>0&&this.idle_seconds>this.auto_xa&&e!=="xa"&&(this.auto_changed_status=!0,this.xmppstatus.setStatus("xa"))},this.registerIntervalHandler=function(){if(this.auto_away<1&&this.auto_xa<1&&this.csi_waiting_time<1)return;this.idle_seconds=0,this.auto_changed_status=!1,t(window).on("click mousemove keypress focus"+y,this.onUserActivity.bind(this)),window.setInterval(this.onEverySecond.bind(this),1e3)},this.playNotification=function(){var e;m.play_sounds&&typeof Audio!="undefined"&&(e=new Audio(m.sounds_path+"msg_received.ogg"),e.canPlayType("/audio/ogg")?e.play():(e=new Audio(m.sounds_path+"msg_received.mp3"),e.play()))},this.giveFeedback=function(e,n){t(".conn-feedback").each(function(r,i){var s=t(i);s.addClass("conn-feedback").text(e),n?s.addClass(n):s.removeClass("error")})},this.log=function(e,t){var n;typeof console=="undefined"||typeof console.log=="undefined"?n={log:function(){},error:function(){}}:n=console,this.debug&&(t==="error"?n.log("ERROR: "+e):n.log(e))},this.rejectPresenceSubscription=function(e,t){var n=i({to:e,type:"unsubscribed"});t&&t!==""&&n.c("status").t(t),m.connection.send(n)},this.getVCard=function(e,n,r){if(!this.use_vcards){n&&n(e,e);return}m.connection.vcard.get(function(r){var i=t(r).find("vCard"),s=i.find("FN").text(),o=i.find("BINVAL").text(),u=i.find("TYPE").text(),a=i.find("URL").text();if(e){var c=m.roster.get(e);c&&(s=f.isEmpty(s)?c.get("fullname")||e:s,c.save({fullname:s,image_type:u,image:o,url:a,vcard_updated:l().format()}))}n&&n(r,e,s,o,u,a)}.bind(this),e,function(t){var n=m.roster.get(e);n&&n.save({vcard_updated:l().format()}),r&&r(t,e)})},this.reconnect=function(e){m.log("Attempting to reconnect in 5 seconds"),m.giveFeedback(q("Attempting to reconnect in 5 seconds"),"error"),setTimeout(function(){m.authentication!=="prebind"?this.connection.connect(this.connection.jid,this.connection.pass,function(e,t){this.onConnectStatusChanged(e,t,!0)}.bind(this),this.connection.wait,this.connection.hold,this.connection.route):m.prebind_url&&(this.clearSession(),this._tearDown(),this.startNewBOSHSession())}.bind(this),5e3)},this.renderLoginPanel=function(){m._tearDown();var e=m.chatboxviews.get("controlbox");e.model.set({connected:!1}),e.renderLoginPanel()},this.onConnectStatusChanged=function(e,t,n){m.log("Status changed to: "+A[e]),e===a.Status.CONNECTED||e===a.Status.ATTACHED?(delete m.disconnection_cause,typeof n!="undefined"&&n?(m.log(e===a.Status.CONNECTED?"Reconnected":"Reattached"),m.onReconnected()):(m.log(e===a.Status.CONNECTED?"Connected":"Attached"),m.onConnected())):e===a.Status.DISCONNECTED?m.disconnection_cause===a.Status.CONNFAIL&&m.auto_reconnect?m.reconnect(t):m.renderLoginPanel():e===a.Status.ERROR?m.giveFeedback(q("Error"),"error"):e===a.Status.CONNECTING?m.giveFeedback(q("Connecting")):e===a.Status.AUTHENTICATING?m.giveFeedback(q("Authenticating")):e===a.Status.AUTHFAIL?(m.giveFeedback(q("Authentication Failed"),"error"),m.connection.disconnect(q("Authentication Failed")),m.disconnection_cause=a.Status.AUTHFAIL):e===a.Status.CONNFAIL?m.disconnection_cause=a.Status.CONNFAIL:e===a.Status.DISCONNECTING&&(m.connection.connected||m.renderLoginPanel(),t&&m.giveFeedback(t,"error"))},this.applyDragResistance=function(e,t){if(typeof e=="undefined")return undefined;if(typeof t=="undefined")return e;var n=10;return e!==t&&Math.abs(e-t)<n?t:e},this.updateMsgCounter=function(){this.msg_counter>0?(document.title.search(/^Messages \(\d+\) /)===-1?document.title="Messages ("+this.msg_counter+") "+document.title:document.title=document.title.replace(/^Messages \(\d+\) /,"Messages ("+this.msg_counter+") "),window.blur(),window.focus()):document.title.search(/^Messages \(\d+\) /)!==-1&&(document.title=document.title.replace(/^Messages \(\d+\) /,""))},this.incrementMsgCounter=function(){this.msg_counter+=1,this.updateMsgCounter()},this.clearMsgCounter=function(){this.msg_counter=0,this.updateMsgCounter()},this.initStatus=function(e){this.xmppstatus=new this.XMPPStatus;var t=h("converse.xmppstatus-"+m.bare_jid);this.xmppstatus.id=t,this.xmppstatus.browserStorage=new Backbone.BrowserStorage[m.storage](t),this.xmppstatus.fetch({success:e,error:e})},this.initSession=function(){this.session=new this.Session;var e=h("converse.bosh-session");this.session.id=e,this.session.browserStorage=new Backbone.BrowserStorage[m.storage](e),this.session.fetch()},this.clearSession=function(){this.roster&&this.roster.browserStorage._clear(),this.session.browserStorage._clear(),m.connection.connected&&m.chatboxes.get("controlbox").save({connected:!1})},this.logOut=function(){m.chatboxviews.closeAllChatBoxes(!1),m.clearSession(),m.connection.disconnect()},this.registerGlobalEventHandlers=function(){t(document).click(function(){t(".toggle-otr ul").is(":visible")&&t(".toggle-otr ul",this).slideUp(),t(".toggle-smiley ul").is(":visible")&&t(".toggle-smiley ul",this).slideUp()}),t(document).on("mousemove",function(e){if(!this.resizing||!this.allow_dragresize)return!0;e.preventDefault(),this.resizing.chatbox.resizeChatBox(e)}.bind(this)),t(document).on("mouseup",function(e){if(!this.resizing||!this.allow_dragresize)return!0;e.preventDefault();var t=this.applyDragResistance(this.resizing.chatbox.height,this.resizing.chatbox.model.get("default_height")),n=this.applyDragResistance(this.resizing.chatbox.width,this.resizing.chatbox.model.get("default_width"));this.connection.connected?(this.resizing.chatbox.model.save({height:t}),this.resizing.chatbox.model.save({width:n})):(this.resizing.chatbox.model.set({height:t}),this.resizing.chatbox.model.set({width:n})),this.resizing=null}.bind(this)),t(window).on("blur focus",function(e){this.windowState!==e.type&&e.type==="focus"&&m.clearMsgCounter(),this.windowState=e.type}.bind(this)),t(window).on("resize",f.debounce(function(e){this.chatboxviews.trimChats()}.bind(this),200))},this.ping=function(e,t,n,r){m.lastStanzaDate=new Date;if(typeof e=="undefined"||e===null)e=a.getDomainFromJid(m.bare_jid);return typeof r=="undefined"&&(r=null),typeof t=="undefined"&&(t=null),typeof n=="undefined"&&(n=null),m.connection?(m.connection.ping.ping(e,t,n,r),!0):!1},this.pong=function(e){return m.lastStanzaDate=new Date,m.connection.ping.pong(e),!0},this.registerPongHandler=function(){m.connection.disco.addFeature(a.NS.PING),m.connection.ping.addPingHandler(this.pong)},this.registerPingHandler=function(){this.registerPongHandler(),this.ping_interval>0&&(this.connection.addHandler(function(){return this.lastStanzaDate=new Date,!0}.bind(m)),this.connection.addTimedHandler(1e3,function(){var e=new Date;return this.lastStanzaDate||(this.lastStanzaDate=e),(e-this.lastStanzaDate)/1e3>this.ping_interval?this.ping():!0}.bind(m)))},this.onReconnected=function(){this.initStatus(function(){this.registerPingHandler(),this.rosterview.registerRosterXHandler(),this.rosterview.registerPresenceHandler(),this.chatboxes.registerMessageHandler(),this.xmppstatus.sendPresence(),this.giveFeedback(q("Contacts"))}.bind(this))},this.enableCarbons=function(){if(!this.message_carbons||this.session.get("carbons_enabled"))return;var e=(new a.Builder("iq",{from:this.connection.jid,id:"enablecarbons",type:"set"})).c("enable",{xmlns:a.NS.CARBONS});this.connection.addHandler(function(e){t(e).find("error").length>0?m.log("ERROR: An error occured while trying to enable message carbons."):(this.session.save({carbons_enabled:!0}),m.log("Message carbons have been enabled."))}.bind(this),null,"iq",null,"enablecarbons"),this.connection.send(e)},this.onConnected=function(){this.chatboxviews.closeAllChatBoxes(),this.jid=this.connection.jid,this.bare_jid=a.getBareJidFromJid(this.connection.jid),this.resource=a.getResourceFromJid(this.connection.jid),this.domain=a.getDomainFromJid(this.connection.jid),this.minimized_chats=new m.MinimizedChats({model:this.chatboxes}),this.features=new this.Features,this.enableCarbons(),this.initStatus(function(){this.registerPingHandler(),this.registerIntervalHandler(),this.chatboxes.onConnected(),this.giveFeedback(q("Contacts")),this.callback&&(this.connection.service==="jasmine tests"?this.callback(this):this.callback())}.bind(this)),m.emit("ready")},this.OTR=Backbone.Model.extend({getSessionPassphrase:function(){if(m.authentication==="prebind"){var e=h(m.connection.jid),t=window.sessionStorage[e];return typeof t=="undefined"&&(t=Math.floor(Math.random()*4294967295).toString(),window.sessionStorage[e]=t),t}return m.connection.pass},generatePrivateKey:function(e){var t=new o,n=m.connection.jid;if(m.cache_otr_key){var r=CryptoJS.lib.PasswordBasedCipher,i=this.getSessionPassphrase();typeof i!="undefined"&&(window.sessionStorage[h(n+"priv_key")]=r.encrypt(CryptoJS.algo.AES,t.packPrivate(),i).toString(),window.sessionStorage[h(n+"instance_tag")]=e,window.sessionStorage[h(n+"pass_check")]=r.encrypt(CryptoJS.algo.AES,"match",i).toString())}return t}}),this.Message=Backbone.Model.extend({idAttribute:"msgid",defaults:function(){return{msgid:m.connection.getUniqueId()}}}),this.Messages=Backbone.Collection.extend({model:m.Message,comparator:"time"}),this.ChatBox=Backbone.Model.extend({initialize:function(){var e=this.get("height"),t=this.get("width"),n={height:m.applyDragResistance(e,this.get("default_height")),width:m.applyDragResistance(t,this.get("default_width")),num_unread:this.get("num_unread")||0};this.get("box_id")!=="controlbox"?(this.messages=new m.Messages,this.messages.browserStorage=new Backbone.BrowserStorage[m.storage](h("converse.messages"+this.get("jid")+m.bare_jid)),this.save(f.extend(n,{chat_state:undefined,box_id:h(this.get("jid")),minimized:this.get("minimized")||!1,otr_status:this.get("otr_status")||T,time_minimized:this.get("time_minimized")||l(),time_opened:this.get("time_opened")||l().valueOf(),url:"",user_id:a.getNodeFromJid(this.get("jid"))}))):this.set(f.extend(n,{time_opened:l(0).valueOf()}))},maximize:function(){this.save({minimized:!1,time_opened:l().valueOf()})},minimize:function(){this.save({minimized:!0,time_minimized:l().format()})},getSession:function(e){var t=CryptoJS.lib.PasswordBasedCipher,n,r,i,s;if(m.cache_otr_key){n=m.otr.getSessionPassphrase();if(typeof n!="undefined"){r=window.sessionStorage[h(this.id+"instance_tag")],i=window.sessionStorage[h(this.id+"priv_key")],s=window.sessionStorage[h(this.connection.jid+"pass_check")];if(i&&r&&typeof s!="undefined"){var a=t.decrypt(CryptoJS.algo.AES,i,n),f=o.parsePrivate(a.toString(CryptoJS.enc.Latin1));if(t.decrypt(CryptoJS.algo.AES,s,n).toString(CryptoJS.enc.Latin1)==="match"){this.trigger("showHelpMessages",[q("Re-establishing encrypted session")]),e({key:f,instance_tag:r});return}}}}this.trigger("showHelpMessages",[q("Generating private key."),q("Your browser might become unresponsive.")],null,!0),setTimeout(function(){var t=u.makeInstanceTag();e({key:m.otr.generatePrivateKey.call(this,t),instance_tag:t})},500)},updateOTRStatus:function(e){switch(e){case u.CONST.STATUS_AKE_SUCCESS:this.otr.msgstate===u.CONST.MSGSTATE_ENCRYPTED&&this.save({otr_status:N});break;case u.CONST.STATUS_END_OTR:this.otr.msgstate===u.CONST.MSGSTATE_FINISHED?this.save({otr_status:k}):this.otr.msgstate===u.CONST.MSGSTATE_PLAINTEXT&&this.save({otr_status:T})}},onSMP:function(e,t){switch(e){case"question":this.otr.smpSecret(prompt(q("Authentication request from %1$s\n\nYour chat contact is attempting to verify your identity, by asking you the question below.\n\n%2$s",[this.get("fullname"),t])));break;case"trust":t===!0?this.save({otr_status:C}):(this.trigger("showHelpMessages",[q("Could not verify this user's identify.")],"error"),this.save({otr_status:N}));break;default:throw new TypeError("ChatBox.onSMP: Unknown type for SMP")}},initiateOTR:function(e){this.save({otr_status:T}),this.getSession(function(t){this.otr=new u({fragment_size:140,send_interval:200,priv:t.key,instance_tag:t.instance_tag,debug:this.debug}),this.otr.on("status",this.updateOTRStatus.bind(this)),this.otr.on("smp",this.onSMP.bind(this)),this.otr.on("ui",function(e){this.trigger("showReceivedOTRMessage",e)}.bind(this)),this.otr.on("io",function(e){this.trigger("sendMessage",new m.Message({message:e}))}.bind(this)),this.otr.on("error",function(e){this.trigger("showOTRError",e)}.bind(this)),this.trigger("showHelpMessages",[q("Exchanging private key with contact.")]),e?this.otr.receiveMsg(e):this.otr.sendQueryMsg()}.bind(this))},endOTR:function(){this.otr&&this.otr.endOtr(),this.save({otr_status:T})},createMessage:function(e,t,n){t=t||e.find("delay");var r=e.children("body").text(),i=t.length>0,s=this.get("fullname"),o=e.attr("type")==="groupchat",u=e.attr("id"),c=e.find(D).length&&D||e.find(P).length&&P||e.find(O).length&&O||e.find(M).length&&M||e.find(H).length&&H,h,p,d,v;o?v=a.unescapeNode(a.getResourceFromJid(e.attr("from"))):v=a.getBareJidFromJid(e.attr("from")),s=(f.isEmpty(s)?v:s).split(" ")[0],i?(h=t.attr("stamp"),p=h):p=l().format(),o&&v===this.get("nick")||!o&&v===m.bare_jid?d="me":d="them",this.messages.create({chat_state:c,delayed:i,fullname:s,message:r||undefined,msgid:u,sender:d,time:p,archive_id:n})},receiveMessage:function(e,t,n){var r=e.children("body"),i=r.length>0?r.text():undefined;if(!i||!m.allow_otr)return this.createMessage(e,t,n);i.match(/^\?OTRv23?/)?this.initiateOTR(i):f.contains([N,C],this.get("otr_status"))?this.otr.receiveMsg(i):i.match(/^\?OTR/)?this.otr?this.otr.receiveMsg(i):this.initiateOTR(i):this.createMessage(e,t,n)}}),this.ChatBoxView=Backbone.View.extend({length:200,tagName:"div",className:"chatbox",is_chatroom:!1,events:{"click .close-chatbox-button":"close","click .toggle-chatbox-button":"minimize","keypress textarea.chat-textarea":"keyPressed","click .toggle-smiley":"toggleEmoticonMenu","click .toggle-smiley ul li":"insertEmoticon","click .toggle-clear":"clearMessages","click .toggle-otr":"toggleOTRMenu","click .start-otr":"startOTRFromToolbar","click .end-otr":"endOTR","click .auth-otr":"authOTR","click .toggle-call":"toggleCall","mousedown .dragresize-top":"onStartVerticalResize","mousedown .dragresize-left":"onStartHorizontalResize","mousedown .dragresize-topleft":"onStartDiagonalResize"},initialize:function(){t(window).on("resize",f.debounce(this.setDimensions.bind(this),100)),this.model.messages.on("add",this.onMessageAdded,this),this.model.on("show",this.show,this),this.model.on("destroy",this.hide,this),this.model.on("change:chat_state",this.sendChatState,this),this.model.on("change:chat_status",this.onChatStatusChanged,this),this.model.on("change:image",this.renderAvatar,this),this.model.on("change:otr_status",this.onOTRStatusChanged,this),this.model.on("change:minimized",this.onMinimizedChanged,this),this.model.on("change:status",this.onStatusChanged,this),this.model.on("showOTRError",this.showOTRError,this),this.model.on("showHelpMessages",this.showHelpMessages,this),this.model.on("sendMessage",this.sendMessage,this),this.model.on("showSentOTRMessage",function(e){this.showMessage({message:e,sender:"me"})},this),this.model.on("showReceivedOTRMessage",function(e){this.showMessage({message:e,sender:"them"})},this),this.updateVCard().render().fetchMessages().insertIntoPage().hide(),(f.contains([N,C],this.model.get("otr_status"))||m.use_otr_by_default)&&this.model.initiateOTR()},render:function(){return this.$el.attr("id",this.model.get("box_id")).html(m.templates.chatbox(f.extend(this.model.toJSON(),{show_toolbar:m.show_toolbar,info_close:q("Close this chat box"),info_minimize:q("Minimize this chat box"),info_view:q("View more information on this person"),label_personal_message:q("Personal message")}))),this.setWidth(),this.$content=this.$el.find(".chat-content"),this.renderToolbar().renderAvatar(),this.$content.on("scroll",f.debounce(this.onScroll.bind(this),100)),m.emit("chatBoxOpened",this),setTimeout(m.refreshWebkit,50),this.showStatusMessage()},setWidth:function(){this.model.get("width")&&this.$el.css("width",this.model.get("width"))},onScroll:function(e){t(e.target).scrollTop()===0&&this.model.messages.length&&this.fetchArchivedMessages({before:this.model.messages.at(0).get("archive_id"),"with":this.model.get("jid"),max:m.archived_messages_page_size})},fetchMessages:function(){return this.model.messages.fetch({add:!0,success:function(){if(!m.features.findWhere({"var":a.NS.MAM}))return;this.model.messages.length<m.archived_messages_page_size&&this.fetchArchivedMessages({before:"","with":this.model.get("jid"),max:m.archived_messages_page_size})}.bind(this)}),this},fetchArchivedMessages:function(e){if(!m.features.findWhere({"var":a.NS.MAM})){m.log("Attempted to fetch archived messages but this user's server doesn't support XEP-0313");return}this.addSpinner(),b.archive.query(f.extend(e,{groupchat:this.is_chatroom}),function(e){this.clearSpinner(),e.length&&(this.is_chatroom?f.map(e,this.onChatRoomMessage.bind(this)):f.map(e,m.chatboxes.onMessage.bind(m.chatboxes)))}.bind(this),function(){this.clearSpinner(),m.log("Error while trying to fetch archived messages","error")}.bind(this))},insertIntoPage:function(){return this.$el.insertAfter(m.chatboxviews.get("controlbox").$el),this},adjustToViewport:function(){var e=Math.max(document.documentElement.clientWidth,window.innerWidth||0),t=Math.max(document.documentElement.clientHeight,window.innerHeight||0);e<=480?(this.model.set("height",undefined),this.model.set("width",undefined)):e<=this.model.get("width")?this.model.set("width",undefined):t<=this.model.get("height")&&this.model.set("height",undefined)},initDragResize:function(){var e=this.$el.find(".box-flyout");if(typeof this.model.get("height")=="undefined"){var t=e.height(),n=e.width();this.model.set("height",t),this.model.set("default_height",t),this.model.set("width",n),this.model.set("default_width",n)}var r=e.css("min-width"),i=e.css("min-height");return this.model.set("min_width",r.endsWith("px")?Number(r.replace(/px$/,"")):0),this.model.set("min_height",i.endsWith("px")?Number(i.replace(/px$/,"")):0),this.prev_pageY=0,this.prev_pageX=0,m.connection.connected&&(this.height=this.model.get("height"),this.width=this.model.get("width")),this},setDimensions:function(){this.adjustToViewport(),this.setChatBoxHeight(this.model.get("height")),this.setChatBoxWidth(this.model.get("width"))},clearStatusNotification:function(){this.$content.find("div.chat-event").remove()},showStatusNotification:function(e,n){n||this.clearStatusNotification(),this.$content.append(t('<div class="chat-info chat-event"></div>').text(e)),this.scrollDown()},clearChatRoomMessages:function(e){typeof e!="undefined"&&e.stopPropagation();var t=confirm(q("Are you sure you want to clear the messages from this room?"));return t===!0&&this.$content.empty(),this},addSpinner:function(){this.$content.first().hasClass("spinner")||this.$content.prepend('<span class="spinner"/>')},clearSpinner:function(){this.$content.children(":first").is("span.spinner")&&this.$content.children(":first").remove()},prependDayIndicator:function(e){var t=l(e).startOf("day");this.$content.prepend(m.templates.new_day({isodate:t.format(),datestring:t.format("dddd MMM Do YYYY")}))},appendMessage:function(e){f.compose(f.debounce(this.scrollDown.bind(this),50),this.$content.append.bind(this.$content))(this.renderMessage(e))},showMessage:function(e){var n=this.$content.children(".chat-message:first"),r=n.data("isodate"),i,s,o,u,a,c;if(!r){this.appendMessage(e);return}s=l(e.time)||l,i=this.$content.children(".chat-message:last").data("isodate");if(typeof i!="undefined"&&(s.isAfter(i)||s.isSame(i))){s.isAfter(i,"day")&&(o=l(s).startOf("day"),this.$content.append(m.templates.new_day({isodate:s.format(),datestring:s.format("dddd MMM Do YYYY")}))),this.appendMessage(e);return}typeof r!="undefined"&&(s.isBefore(r)||s.isSame(r)&&!s.isSame(i))?(n.prev().length===0&&this.prependDayIndicator(r),s.isBefore(r,"day")?(f.compose(this.scrollDownMessageHeight.bind(this),function(e){return this.$content.prepend(e),e}.bind(this))(this.renderMessage(e)),this.prependDayIndicator(s)):f.compose(this.scrollDownMessageHeight.bind(this),function(e){return e.insertBefore(n),e})(this.renderMessage(e))):(s=s.format(),u=this.$content.children(".chat-message"),a=f.map(u,function(e){return t(e).data("isodate")}),a.push(s),a.sort(),c=a.indexOf(s)-1,f.compose(this.scrollDownMessageHeight.bind(this),function(e){return e.insertAfter(this.$content.find('.chat-message[data-isodate="'+a[c]+'"]')),e}.bind(this))(this.renderMessage(e)))},renderMessage:function(e){var n=l(e.time)||l,r=e.message,i=r.match(/^\/(.*?)(?: (.*))?$/),s=this.model.get("fullname")||e.fullname,o=e.delayed&&"delayed"||"",u,a;return i&&i[1]==="me"?(r=r.replace(/^\/me/,""),u=m.templates.action,a=s):(u=m.templates.message,a=e.sender==="me"&&q("me")||s),this.$content.find("div.chat-event").remove(),this.is_chatroom&&e.sender==="them"&&(new RegExp("\\b"+this.model.get("nick")+"\\b")).test(r)&&(o+=" mentioned"),t(u({msgid:e.msgid,sender:e.sender,time:n.format("hh:mm"),isodate:n.format(),username:a,message:"",extra_classes:o})).children(".chat-msg-content").first().text(r).addHyperlinks().addEmoticons(m.visible_toolbar_buttons.emoticons).parent()},showHelpMessages:function(e,n,r){var i,s=e.length;for(i=0;i<s;i++)this.$content.append(t('<div class="chat-'+(n||"info")+'">'+e[i]+"</div>"));return r===!0?this.$content.append('<span class="spinner"/>'):r===!1&&this.$content.find("span.spinner").remove(),this.scrollDown()},onMessageAdded:function(e){typeof this.clear_status_timeout!="undefined"&&(clearTimeout(this.clear_status_timeout),delete this.clear_status_timeout);if(!e.get("message")){if(e.get("chat_state")===D){this.showStatusNotification(e.get("fullname")+" "+q("is typing")),this.clear_status_timeout=setTimeout(this.clearStatusNotification.bind(this),1e4);return}if(e.get("chat_state")===P){this.showStatusNotification(e.get("fullname")+" "+q("has stopped typing"));return}if(f.contains([O,M],e.get("chat_state"))){this.$content.find("div.chat-event").remove();return}if(e.get("chat_state")===H){this.showStatusNotification(e.get("fullname")+" "+q("has gone away"));return}}else this.showMessage(f.clone(e.attributes));e.get("sender")!=="me"&&m.windowState==="blur"&&m.incrementMsgCounter(),!this.model.get("minimized")&&!this.$el.is(":visible")&&f.debounce(this.show.bind(this),100)()},sendMessage:function(e){var t=this.model.get("jid"),n=r({from:m.connection.jid,to:t,type:"chat",id:e.get("msgid")}).c("body").t(e.get("message")).up().c(M,{xmlns:a.NS.CHATSTATES}).up();this.model.get("otr_status")!==T&&n.c("private",{xmlns:a.NS.CARBONS}),m.connection.send(n),m.forward_messages&&m.connection.send(r({to:m.bare_jid,type:"chat",id:e.get("msgid")}).c("forwarded",{xmlns:"urn:xmpp:forward:0"}).c("delay",{xmns:"urn:xmpp:delay",stamp:(new Date).getTime()}).up().cnode(n.tree()))},onMessageSubmitted:function(e){if(!m.connection.authenticated)return this.showHelpMessages(["Sorry, the connection has been lost, and your message could not be sent"],"error");var t=e.replace(/^\s*/,"").match(/^\/(.*)\s*$/),n;if(t){if(t[1]==="clear")return this.clearMessages();if(t[1]==="help"){n=["<strong>/help</strong>:"+q("Show this menu")+"","<strong>/me</strong>:"+q("Write in the third person")+"","<strong>/clear</strong>:"+q("Remove messages")+""],this.showHelpMessages(n);return}if(m.allow_otr&&t[1]==="endotr")return this.endOTR();if(m.allow_otr&&t[1]==="otr")return this.model.initiateOTR()}if(f.contains([N,C],this.model.get("otr_status")))this.model.otr.sendMsg(e),this.model.trigger("showSentOTRMessage",e);else{var r=m.xmppstatus.get("fullname");r=f.isEmpty(r)?m.bare_jid:r;var i=this.model.messages.create({fullname:r,sender:"me",time:l().format(),message:e});this.sendMessage(i)}},sendChatState:function(){m.connection.send(r({to:this.model.get("jid"),type:"chat"}).c(this.model.get("chat_state"),{xmlns:a.NS.CHATSTATES}))},setChatState:function(e,t){return typeof this.chat_state_timeout!="undefined"&&(clearTimeout(this.chat_state_timeout),delete this.chat_state_timeout),e===D?this.chat_state_timeout=setTimeout(this.setChatState.bind(this),m.TIMEOUTS.PAUSED,P):e===P&&(this.chat_state_timeout=setTimeout(this.setChatState.bind(this),m.TIMEOUTS.INACTIVE,O)),!t&&this.model.get("chat_state")!==e&&this.model.set("chat_state",e),this},keyPressed:function(e){var n=t(e.target),r;e.keyCode===L.ENTER?(e.preventDefault(),r=n.val(),n.val("").focus(),r!==""&&(this.model.get("chatroom")?this.onChatRoomMessageSubmitted(r):this.onMessageSubmitted(r),m.emit("messageSend",r)),this.setChatState(M)):this.model.get("chatroom")||this.setChatState(D,e.keyCode===L.FORWARD_SLASH)},onStartVerticalResize:function(e){if(!m.allow_dragresize)return!0;this.height=this.$el.children(".box-flyout").height(),m.resizing={chatbox:this,direction:"top"},this.prev_pageY=e.pageY},onStartHorizontalResize:function(e){if(!m.allow_dragresize)return!0;this.width=this.$el.children(".box-flyout").width(),m.resizing={chatbox:this,direction:"left"},this.prev_pageX=e.pageX},onStartDiagonalResize:function(e){this.onStartHorizontalResize(e),this.onStartVerticalResize(e),m.resizing.direction="topleft"},setChatBoxHeight:function(e){this.model.get("minimized")||(e?e=m.applyDragResistance(e,this.model.get("default_height"))+"px":e="",this.$el.children(".box-flyout")[0].style.height=e)},setChatBoxWidth:function(e){this.model.get("minimized")||(e?e=m.applyDragResistance(e,this.model.get("default_width"))+"px":e="",this.$el[0].style.width=e,this.$el.children(".box-flyout")[0].style.width=e)},resizeChatBox:function(e){var t;m.resizing.direction.indexOf("top")===0&&(t=e.pageY-this.prev_pageY,t&&(this.height=this.height-t>(this.model.get("min_height")||0)?this.height-t:this.model.get("min_height"),this.prev_pageY=e.pageY,this.setChatBoxHeight(this.height))),m.resizing.direction.indexOf("left")!==-1&&(t=this.prev_pageX-e.pageX,t&&(this.width=this.width+t>(this.model.get("min_width")||0)?this.width+t:this.model.get("min_width"),this.prev_pageX=e.pageX,this.setChatBoxWidth(this.width)))},clearMessages:function(e){e&&e.preventDefault&&e.preventDefault();var t=confirm(q("Are you sure you want to clear the messages from this chat box?"));return t===!0&&(this.$content.empty(),this.model.messages.reset(),this.model.messages.browserStorage._clear()),this},insertEmoticon:function(e){e.stopPropagation(),this.$el.find(".toggle-smiley ul").slideToggle(200);var n=this.$el.find("textarea.chat-textarea"),r=n.val(),i=t(e.target);i=i.is("a")?i:i.children("a"),r&&r[r.length-1]!==" "&&(r+=" "),n.focus().val(r+i.data("emoticon")+" ")},toggleEmoticonMenu:function(e){e.stopPropagation(),this.$el.find(".toggle-smiley ul").slideToggle(200)},toggleOTRMenu:function(e){e.stopPropagation(),this.$el.find(".toggle-otr ul").slideToggle(200)},showOTRError:function(e){e==="Message cannot be sent at this time."?this.showHelpMessages([q("Your message could not be sent")],"error"):e==="Received an unencrypted message."?this.showHelpMessages([q("We received an unencrypted message")],"error"):e==="Received an unreadable encrypted message."?this.showHelpMessages([q("We received an unreadable encrypted message")],"error"):this.showHelpMessages(["Encryption error occured: "+e],"error"),m.log("OTR ERROR:"+e)},startOTRFromToolbar:function(e){t(e.target).parent().parent().slideUp(),e.stopPropagation(),this.model.initiateOTR()},endOTR:function(e){typeof e!="undefined"&&(e.preventDefault(),e.stopPropagation()),this.model.endOTR()},authOTR:function(e){var n=t(e.target).data().scheme,r,i,s;n==="fingerprint"?(r=confirm(q("Here are the fingerprints, please confirm them with %1$s, outside of this chat.\n\nFingerprint for you, %2$s: %3$s\n\nFingerprint for %1$s: %4$s\n\nIf you have confirmed that the fingerprints match, click OK, otherwise click Cancel.",[this.model.get("fullname"),m.xmppstatus.get("fullname")||m.bare_jid,this.model.otr.priv.fingerprint(),this.model.otr.their_priv_pk.fingerprint()])),r===!0?this.model.save({otr_status:C}):this.model.save({otr_status:N})):n==="smp"?(alert(q("You will be prompted to provide a security question and then an answer to that question.\n\nYour contact will then be prompted the same question and if they type the exact same answer (case sensitive), their identity will be verified.")),i=prompt(q("What is your security question?")),i&&(s=prompt(q("What is the answer to the security question?")),this.model.otr.smpSecret(s,i))):this.showHelpMessages([q("Invalid authentication scheme provided")],"error")},toggleCall:function(e){e.stopPropagation(),m.emit("callButtonClicked",{connection:m.connection,model:this.model})},onChatStatusChanged:function(e){var t=e.get("chat_status"),n=e.get("fullname");n=f.isEmpty(n)?e.get("jid"):n,this.$el.is(":visible")&&(t==="offline"?this.showStatusNotification(n+" "+q("has gone offline")):t==="away"?this.showStatusNotification(n+" "+q("has gone away")):t==="dnd"?this.showStatusNotification(n+" "+q("is busy")):t==="online"&&this.$el.find("div.chat-event").remove()),m.emit("contactStatusChanged",e.attributes,e.get("chat_status"))},onStatusChanged:function(e){this.showStatusMessage(),m.emit("contactStatusMessageChanged",e.attributes,e.get("status"))},onOTRStatusChanged:function(){this.renderToolbar().informOTRChange()},onMinimizedChanged:function(e){e.get("minimized")?this.hide():this.maximize()},showStatusMessage:function(e){return e=e||this.model.get("status"),typeof e=="string"&&this.$el.find("p.user-custom-message").text(e).attr("title",e),this},close:function(e){return e&&e.preventDefault&&e.preventDefault(),m.connection.connected?(this.model.destroy(),this.setChatState(O)):this.hide(),m.emit("chatBoxClosed",this),this},maximize:function(){var e=m.chatboxviews;this.$el.insertAfter(e.get("controlbox").$el).show("fast",function(){e.trimChats(this),m.refreshWebkit(),this.setChatState(M).focus(),m.emit("chatBoxMaximized",this)}.bind(this))},minimize:function(e){e&&e.preventDefault&&e.preventDefault(),this.setChatState(O).model.minimize(),this.$el.hide("fast",m.refreshwebkit),m.emit("chatBoxMinimized",this)},updateVCard:function(){if(!this.use_vcards)return this;var e=this.model.get("jid"),t=m.roster.get(e);return t&&!t.get("vcard_updated")&&m.getVCard(e,function(e,t,n,r,i,s){this.model.save({fullname:n||t,url:s,image_type:i,image:r})}.bind(this),function(){m.log("ChatBoxView.initialize: An error occured while fetching vcard")}),this},informOTRChange:function(){var e=this.model.toJSON(),t=[];return e.otr_status===T?t.push(q("Your messages are not encrypted anymore")):e.otr_status===N?t.push(q("Your messages are now encrypted but your contact's identity has not been verified.")):e.otr_status===C?t.push(q("Your contact's identify has been verified.")):e.otr_status===k&&t.push(q("Your contact has ended encryption on their end, you should do the same.")),this.showHelpMessages(t,"info",!1)},renderToolbar:function(){if(m.show_toolbar){var e=this.model.toJSON();e.otr_status===T?e.otr_tooltip=q("Your messages are not encrypted. Click here to enable OTR encryption."):e.otr_status===N?e.otr_tooltip=q("Your messages are encrypted, but your contact has not been verified."):e.otr_status===C?e.otr_tooltip=q("Your messages are encrypted and your contact verified."):e.otr_status===k&&(e.otr_tooltip=q("Your contact has closed their end of the private session, you should do the same")),this.$el.find(".chat-toolbar").html(m.templates.toolbar(f.extend(e,{FINISHED:k,UNENCRYPTED:T,UNVERIFIED:N,VERIFIED:C,allow_otr:m.allow_otr&&!this.is_chatroom,label_clear:q("Clear all messages"),label_end_encrypted_conversation:q("End encrypted conversation"),label_insert_smiley:q("Insert a smiley"),label_hide_occupants:q("Hide the list of occupants"),label_refresh_encrypted_conversation:q("Refresh encrypted conversation"),label_start_call:q("Start a call"),label_start_encrypted_conversation:q("Start encrypted conversation"),label_verify_with_fingerprints:q("Verify with fingerprints"),label_verify_with_smp:q("Verify with SMP"),label_whats_this:q("What's this?"),otr_status_class:U[e.otr_status],otr_translated_status:z[e.otr_status],show_call_button:m.visible_toolbar_buttons.call,show_clear_button:m.visible_toolbar_buttons.clear,show_emoticons:m.visible_toolbar_buttons.emoticons,show_occupants_toggle:this.is_chatroom&&m.visible_toolbar_buttons.toggle_occupants})))}return this},renderAvatar:function(){if(!this.model.get("image"))return;var e="data:"+this.model.get("image_type")+";base64,"+this.model.get("image"),n=t('<canvas height="32px" width="32px" class="avatar"></canvas>').get(0);if(!n.getContext||!n.getContext("2d"))return this;var r=n.getContext("2d"),i=new Image;return i.onload=function(){var e=i.width/i.height;e<1?r.drawImage(i,0,0,32,32*(1/e)):r.drawImage(i,0,0,32,32*e)},i.src=e,this.$el.find(".chat-title").before(n),this},focus:function(){return this.$el.find(".chat-textarea").focus(),m.emit("chatBoxFocused",this),this},hide:function(){return this.$el.is(":visible")&&this.$el.css("opacity")==="1"&&(this.$el.hide(),m.refreshWebkit()),this},show:function(e){return this.$el.is(":visible")&&this.$el.css("opacity")==="1"?this.focus():(this.initDragResize().setDimensions(),this.$el.fadeIn(function(){typeof e=="function"&&e.apply(this,arguments),m.connection.connected&&this.model.save(),this.setChatState(M),this.scrollDown().focus()}.bind(this)),this)},scrollDownMessageHeight:function(e){return this.$content.is(":visible")&&this.$content.scrollTop(this.$content.scrollTop()+e[0].scrollHeight),this},scrollDown:function(){return this.$content.is(":visible")&&this.$content.scrollTop(this.$content[0].scrollHeight),this}}),this.ContactsPanel=Backbone.View.extend({tagName:"div",className:"controlbox-pane",id:"users",events:{"click a.toggle-xmpp-contact-form":"toggleContactForm","submit form.add-xmpp-contact":"addContactFromForm","submit form.search-xmpp-contact":"searchContacts","click a.subscribe-to-user":"addContactFromList"},initialize:function(e){e.$parent.append(this.$el),this.$tabs=e.$parent.parent().find("#controlbox-tabs")},render:function(){var e,t=m.templates.contacts_panel({label_online:q("Online"),label_busy:q("Busy"),label_away:q("Away"),label_offline:q("Offline"),label_logout:q("Log out"),allow_logout:m.allow_logout});return this.$tabs.append(m.templates.contacts_tab({label_contacts:G})),m.xhr_user_search?e=m.templates.search_contact({label_contact_name:q("Contact name"),label_search:q("Search")}):e=m.templates.add_contact_form({label_contact_username:q("e.g. user@example.com"),label_add:q("Add")}),m.allow_contact_requests&&(t+=m.templates.add_contact_dropdown({label_click_to_chat:q("Click to add new chat contacts"),label_add_contact:q("Add a contact")})),this.$el.html(t),this.$el.find(".search-xmpp ul").append(e),this},toggleContactForm:function(e){e.preventDefault(),this.$el.find(".search-xmpp").toggle("fast",function(){t(this).is(":visible")&&t(this).find("input.username").focus()})},searchContacts:function(e){e.preventDefault(),t.getJSON(m.xhr_user_search_url+"?q="+t(e.target).find("input.username").val(),function(e){var n=t(".search-xmpp ul");n.find("li.found-user").remove(),n.find("li.chat-info").remove(),e.length||n.append('<li class="chat-info">'+q("No users found")+"</li>"),t(e).each(function(e,r){n.append(t('<li class="found-user"></li>').append(t('<a class="subscribe-to-user" href="#" title="'+q("Click to add as a chat contact")+'"></a>').attr("data-recipient",a.getNodeFromJid(r.id)+"@"+a.getDomainFromJid(r.id)).text(r.fullname)))})})},addContactFromForm:function(e){e.preventDefault();var n=t(e.target).find("input"),r=n.val();if(!r){n.addClass("error");return}m.roster.addAndSubscribe(r),t(".search-xmpp").hide()},addContactFromList:function(e){e.preventDefault();var n=t(e.target),r=n.attr("data-recipient"),i=n.text();m.roster.addAndSubscribe(r,i),n.parent().remove(),t(".search-xmpp").hide()}}),this.RoomsPanel=Backbone.View.extend({tagName:"div",className:"controlbox-pane",id:"chatrooms",events:{"submit form.add-chatroom":"createChatRoom","click input#show-rooms":"showRooms","click a.open-room":"createChatRoom","click a.room-info":"showRoomInfo","change input[name=server]":"setDomain","change input[name=nick]":"setNick"},initialize:function(e){this.$parent=e.$parent,this.model.on("change:muc_domain",this.onDomainChange,this),this.model.on("change:nick",this.onNickChange,this)},render:function(){return this.$parent.append(this.$el.html(m.templates.room_panel({server_input_type:m.hide_muc_server&&"hidden"||"text",server_label_global_attr:m.hide_muc_server&&" hidden"||"",label_room_name:q("Room name"),label_nickname:q("Nickname"),label_server:q("Server"),label_join:q("Join Room"),label_show_rooms:q("Show rooms")})).hide()),this.$tabs=this.$parent.parent().find("#controlbox-tabs"),this.$tabs.append(m.templates.chatrooms_tab({label_rooms:q("Rooms")})),this},onDomainChange:function(e){var t=this.$el.find("input.new-chatroom-server");t.val(e.get("muc_domain")),m.auto_list_rooms&&this.updateRoomsList()},onNickChange:function(e){var t=this.$el.find("input.new-chatroom-nick");t.val(e.get("nick"))},informNoRoomsFound:function(){var e=this.$el.find("#available-chatrooms");e.html("<dt>"+q("No rooms on %1$s",this.model.get("muc_domain"))+"</dt>"),t("input#show-rooms").show().siblings("span.spinner").remove()},onRoomsFound:function(e){var n,r,i,s,o=this.$el.find("#available-chatrooms");this.rooms=t(e).find("query").find("item");if(this.rooms.length){o.html("<dt>"+q("Rooms on %1$s",this.model.get("muc_domain"))+"</dt>"),s=document.createDocumentFragment();for(i=0;i<this.rooms.length;i++)n=a.unescapeNode(t(this.rooms[i]).attr("name")||t(this.rooms[i]).attr("jid")),r=t(this.rooms[i]).attr("jid"),s.appendChild(t(m.templates.room_item({name:n,jid:r,open_title:q("Click to open this room"),info_title:q("Show more information on this room")}))[0]);o.append(s),t("input#show-rooms").show().siblings("span.spinner").remove()}else this.informNoRoomsFound();return!0},updateRoomsList:function(){m.connection.sendIQ(n({to:this.model.get("muc_domain"),from:m.connection.jid,type:"get"}).c("query",{xmlns:a.NS.DISCO_ITEMS}),this.onRoomsFound.bind(this),this.informNoRoomsFound.bind(this))},showRooms:function(){var e=this.$el.find("#available-chatrooms"),n=this.$el.find("input.new-chatroom-server"),r=n.val();if(!r){n.addClass("error");return}this.$el.find("input.new-chatroom-name").removeClass("error"),n.removeClass("error"),e.empty(),t("input#show-rooms").hide().after('<span class="spinner"/>'),this.model.save({muc_domain:r}),this.updateRoomsList()},showRoomInfo:function(e){var n=e.target,r=t(n).parent("dd"),i=r.find("div.room-info");i.length?i.remove():(r.find("span.spinner").remove(),r.append('<span class="spinner hor_centered"/>'),m.connection.disco.info(t(n).attr("data-room-jid"),null,function(e){var n=t(e);r.find("span.spinner").replaceWith(m.templates.room_description({desc:n.find('field[var="muc#roominfo_description"] value').text(),occ:n.find('field[var="muc#roominfo_occupants"] value').text(),hidden:n.find('feature[var="muc_hidden"]').length,membersonly:n.find('feature[var="muc_membersonly"]').length,moderated:n.find('feature[var="muc_moderated"]').length,nonanonymous:n.find('feature[var="muc_nonanonymous"]').length,open:n.find('feature[var="muc_open"]').length,passwordprotected:n.find('feature[var="muc_passwordprotected"]').length,persistent:n.find('feature[var="muc_persistent"]').length,publicroom:n.find('feature[var="muc_public"]').length,semianonymous:n.find('feature[var="muc_semianonymous"]').length,temporary:n.find('feature[var="muc_temporary"]').length,unmoderated:n.find('feature[var="muc_unmoderated"]').length,label_desc:q("Description:"),label_occ:q("Occupants:"),label_features:q("Features:"),label_requires_auth:q("Requires authentication"),label_hidden:q("Hidden"),label_requires_invite:q("Requires an invitation"),label_moderated:q("Moderated"),label_non_anon:q("Non-anonymous"),label_open_room:q("Open room"),label_permanent_room:q("Permanent room"),label_public:q("Public"),label_semi_anon:q("Semi-anonymous"),label_temp_room:q("Temporary room"),label_unmoderated:q("Unmoderated")}))}.bind(this)))},createChatRoom:function(e){e.preventDefault();var n,r,i,s,o,u=this.$el.find("input.new-chatroom-nick"),f=u.val(),l;f?u.removeClass("error"):u.addClass("error");if(e.type==="click")n=t(e.target).text(),o=t(e.target).attr("data-room-jid");else{r=this.$el.find("input.new-chatroom-name"),s=this.$el.find("input.new-chatroom-server"),i=s.val(),n=r.val().trim(),r.val("");if(!n||!i){n||r.addClass("error"),i||s.addClass("error");return}o=a.escapeNode(n.toLowerCase())+"@"+i,r.removeClass("error"),s.removeClass("error"),this.model.save({muc_domain:i})}if(!f)return;l=m.chatboxviews.showChat({id:o,jid:o,name:n||a.unescapeNode(a.getNodeFromJid(o)),nick:f,chatroom:!0,box_id:h(o)})},setDomain:function(e){this.model.save({muc_domain:e.target.value})},setNick:function(e){this.model.save({nick:e.target.value})}}),this.ControlBoxView=m.ChatBoxView.extend({tagName:"div",className:"chatbox",id:"controlbox",events:{"click a.close-chatbox-button":"close","click ul#controlbox-tabs li a":"switchTab","mousedown .dragresize-top":"onStartVerticalResize","mousedown .dragresize-left":"onStartHorizontalResize","mousedown .dragresize-topleft":"onStartDiagonalResize"},initialize:function(){this.$el.insertAfter(m.controlboxtoggle.$el),t(window).on("resize",f.debounce(this.setDimensions.bind(this),100)),this.model.on("change:connected",this.onConnected,this),this.model.on("destroy",this.hide,this),this.model.on("hide",this.hide,this),this.model.on("show",this.show,this),this.model.on("change:closed",this.ensureClosedState,this),this.render(),this.model.get("connected")&&this.initRoster(),this.model.get("closed")?this.hide():this.show()},render:function(){return!m.connection.connected||!m.connection.authenticated||m.connection.disconnecting?this.renderLoginPanel():(!this.contactspanel||!this.contactspanel.$el.is(":visible"))&&this.renderContactsPanel(),this},giveFeedback:function(e,t){var n=this.$(".conn-feedback");n.addClass("conn-feedback").text(e),t&&n.addClass(t)},onConnected:function(){if(this.model.get("connected")){this.render().initRoster(),m.features.off("add",this.featureAdded,this),m.features.on("add",this.featureAdded,this);var e=m.features.findWhere({"var":a.NS.MUC});e&&this.featureAdded(e)}},initRoster:function(){m.roster=new m.RosterContacts,m.roster.browserStorage=new Backbone.BrowserStorage[m.storage](h("converse.contacts-"+m.bare_jid));var e=new m.RosterGroups;return e.browserStorage=new Backbone.BrowserStorage[m.storage](h("converse.roster.groups"+m.bare_jid)),m.rosterview=new m.RosterView({model:e}),this.contactspanel.$el.append(m.rosterview.$el),m.rosterview.render().fetch().update(),this},renderLoginPanel:function(){var e=this.$(".conn-feedback");this.$el.html(m.templates.controlbox(this.model.toJSON()));var t={$parent:this.$el.find(".controlbox-panes"),model:this};return this.loginpanel?(this.loginpanel.delegateEvents().initialize(t),m.allow_registration&&this.registerpanel.delegateEvents().initialize(t)):(this.loginpanel=new m.LoginPanel(t),m.allow_registration&&(this.registerpanel=new m.RegisterPanel(t))),this.loginpanel.render(),m.allow_registration&&this.registerpanel.render().$el.hide(),this.initDragResize().setDimensions(),e.length&&e.text()!==q("Connecting")&&this.$(".conn-feedback").replaceWith(e),this},renderContactsPanel:function(){this.$el.html(m.templates.controlbox(this.model.toJSON())),this.contactspanel=new m.ContactsPanel({$parent:this.$el.find(".controlbox-panes")}),this.contactspanel.render(),m.xmppstatusview=new m.XMPPStatusView({model:m.xmppstatus}),m.xmppstatusview.render(),m.allow_muc&&(this.roomspanel=new m.RoomsPanel({$parent:this.$el.find(".controlbox-panes"),model:new(Backbone.Model.extend({id:h("converse.roomspanel"+m.bare_jid),browserStorage:new Backbone.BrowserStorage[m.storage](h("converse.roomspanel"+m.bare_jid))}))}),this.roomspanel.render().model.fetch(),this.roomspanel.model.get("nick")||this.roomspanel.model.save({nick:a.getNodeFromJid(m.bare_jid)})),this.initDragResize().setDimensions()},close:function(e){return e&&e.preventDefault&&e.preventDefault(),m.connection.connected?this.model.save({closed:!0}):this.model.trigger("hide"),m.emit("controlBoxClosed",this),this},ensureClosedState:function(){this.model.get("closed")?this.hide():this.show()},hide:function(e){return this.$el.hide("fast",function(){m.refreshWebkit(),m.emit("chatBoxClosed",this),m.controlboxtoggle.show(function(){typeof e=="function"&&e()})}),this},show:function(){return m.controlboxtoggle.hide(function(){this.$el.show("fast",function(){m.rosterview&&m.rosterview.update(),m.refreshWebkit()}.bind(this)),m.emit("controlBoxOpened",this)}.bind(this)),this},featureAdded:function(e){if(e.get("var")===a.NS.MUC&&m.allow_muc){this.roomspanel.model.save({muc_domain:e.get("from")});var t=this.$el.find("input.new-chatroom-server");t.is(":focus")||t.val(this.roomspanel.model.get("muc_domain"))}},switchTab:function(e){e&&e.preventDefault&&e.preventDefault();var n=t(e.target),r=n.parent().siblings("li").children("a"),i=t(n.attr("href"));return t(r.attr("href")).hide(),r.removeClass("current"),n.addClass("current"),i.show(),this},showHelpMessages:function(e){return}}),this.ChatRoomOccupant=Backbone.Model,this.ChatRoomOccupantView=Backbone.View.extend({tagName:"li",initialize:function(){this.model.on("add",this.render,this),this.model.on("change",this.render,this),this.model.on("destroy",this.destroy,this)},render:function(){var e=m.templates.occupant(f.extend(this.model.toJSON(),{desc_moderator:q("This user is a moderator"),desc_occupant:q("This user can send messages in this room"),desc_visitor:q("This user can NOT send messages in this room")}));return this.$el.replaceWith(e),this.setElement(e,!0),this},destroy:function(){this.$el.remove()}}),this.ChatRoomOccupants=Backbone.Collection.extend({model:m.ChatRoomOccupant}),this.ChatRoomOccupantsView=Backbone.Overview.extend({tagName:"div",className:"occupants",initialize:function(){this.model.on("add",this.onOccupantAdded,this)},render:function(){return this.$el.html(m.templates.chatroom_sidebar({label_invitation:q("Invite..."),label_occupants:q("Occupants")})),this.initInviteWidget()},onOccupantAdded:function(e){var t=this.get(e.get("id"));t?(delete t.model,t.model=e,t.initialize()):t=this.add(e.get("id"),new m.ChatRoomOccupantView({model:e})),this.$(".occupant-list").append(t.render().$el)},parsePresence:function(e){var t=a.getResourceFromJid(e.getAttribute("from")),n={id:t,nick:t,type:e.getAttribute("type"),states:[]};return f.each(e.childNodes,function(e){switch(e.nodeName){case"status":n.status=e.textContent||null;break;case"show":n.show=e.textContent||null;break;case"x":e.getAttribute("xmlns")===a.NS.MUC_USER&&f.each(e.childNodes,function(e){switch(e.nodeName){case"item":n.affiliation=e.getAttribute("affiliation"),n.role=e.getAttribute("role"),n.jid=e.getAttribute("jid"),n.nick=e.getAttribute("nick")||n.nick;break;case"status":e.getAttribute("code")&&n.states.push(e.getAttribute("code"))}})}}),n},updateOccupantsOnPresence:function(e){var t,n=this.parsePresence(e);switch(n.type){case"error":return!0;case"unavailable":t=this.model.get(n.id),t&&t.destroy();break;default:t=this.model.get(n.id),t?t.save(n):this.model.create(n)}},initInviteWidget:function(){var e=this.$("input.invited-contact");return e.typeahead({minLength:1,highlight:!0},{name:"contacts-dataset",source:function(e,t){var n=[];f.each(m.roster.filter(p(["fullname","jid"],e)),function(e){n.push({value:e.get("fullname"),jid:e.get("jid")})}),t(n)},templates:{suggestion:f.template('<p data-jid="{{jid}}">{{value}}</p>')}}),e.on("typeahead:selected",function(e,n,r){var i=prompt(q(R('You are about to invite %1$s to the chat room "%2$s". '),n.value,this.model.get("id"))+q("You may optionally include a message, explaining the reason for the invitation."));i!==null&&this.chatroomview.directInvite(n.jid,i),t(e.target).typeahead("val","")}.bind(this)),this}}),this.ChatRoomView=m.ChatBoxView.extend({length:300,tagName:"div",className:"chatbox chatroom",events:{"click .close-chatbox-button":"close","click .toggle-chatbox-button":"minimize","click .configure-chatroom-button":"configureChatRoom","click .toggle-smiley":"toggleEmoticonMenu","click .toggle-smiley ul li":"insertEmoticon","click .toggle-clear":"clearChatRoomMessages","click .toggle-call":"toggleCall","click .toggle-occupants a":"toggleOccupants","keypress textarea.chat-textarea":"keyPressed","mousedown .dragresize-top":"onStartVerticalResize","mousedown .dragresize-left":"onStartHorizontalResize","mousedown .dragresize-topleft":"onStartDiagonalResize"},is_chatroom:!0,initialize:function(){t(window).on("resize",f.debounce(this.setDimensions.bind(this),100)),this.model.messages.on("add",this.onMessageAdded,this),this.model.on("change:minimized",function(e){e.get("minimized")?this.hide():this.maximize()},this),this.model.on("destroy",function(){this.hide().leave()},this),this.occupantsview=new m.ChatRoomOccupantsView({model:new m.ChatRoomOccupants({nick:this.model.get("nick")})});var e=h("converse.occupants"+m.bare_jid+this.model.get("id")+this.model.get("nick"));this.occupantsview.model.browserStorage=new Backbone.BrowserStorage[m.storage](e),this.occupantsview.chatroomview=this,this.render().$el.hide(),this.occupantsview.model.fetch({add:!0}),this.join(null,{maxstanzas:m.muc_history_max_stanzas}),this.fetchMessages(),m.emit("chatRoomOpened",this),this.$el.insertAfter(m.chatboxviews.get("controlbox").$el),this.model.get("minimized")?this.hide():this.show()},render:function(){return this.$el.attr("id",this.model.get("box_id")).html(m.templates.chatroom(this.model.toJSON())),this.renderChatArea(),this.$content.on("scroll",f.debounce(this.onScroll.bind(this),100)),this.setWidth(),setTimeout(m.refreshWebkit,50),this},renderChatArea:function(){return this.$(".chat-area").length||(this.$(".chatroom-body").empty().append(m.templates.chatarea({show_toolbar:m.show_toolbar,label_message:q("Message")})).append(this.occupantsview.render().$el),this.renderToolbar(),this.$content=this.$el.find(".chat-content")),this.toggleOccupants(null,!0),this},toggleOccupants:function(e,t){e&&(e.preventDefault(),e.stopPropagation()),t&&this.model.set({hidden_occupants:!this.model.get("hidden_occupants")});var n=this.$(".icon-hide-users");this.model.get("hidden_occupants")?(this.model.save({hidden_occupants:!1}),n.removeClass("icon-show-users").addClass("icon-hide-users"),this.$(".chat-area").removeClass("full"),this.$("div.occupants").removeClass("hidden"),this.scrollDown()):(this.model.save({hidden_occupants:!0}),n.removeClass("icon-hide-users").addClass("icon-show-users"),this.$(".occupants").addClass("hidden"),this.$(".chat-area").addClass("full"),this.scrollDown())},directInvite:function(e,t){var n={xmlns:"jabber:x:conference",jid:this.model.get("jid")};t!==null&&(n.reason=t),this.model.get("password")&&(n.password=this.model.get("password"));var i=r({from:m.connection.jid,to:e,id:m.connection.getUniqueId()}).c("x",n);m.connection.send(i),m.emit("roomInviteSent",this,e,t)},onCommandError:function(e){this.showStatusNotification(q("Error: could not execute the command"),!0)},sendChatRoomMessage:function(e){var t=m.connection.getUniqueId(),n=r({to:this.model.get("jid"),from:m.connection.jid,type:"groupchat",id:t}).c("body").t(e).up().c("x",{xmlns:"jabber:x:event"}).c("composing");m.connection.send(n);var i=m.xmppstatus.get("fullname");this.model.messages.create({fullname:f.isEmpty(i)?m.bare_jid:i,sender:"me",time:l().format(),message:e,msgid:t})},setAffiliation:function(e,t,r,i,o,u){var f=s("item",{jid:t,affiliation:r}),l=n({to:e,type:"set"}).c("query",{xmlns:a.NS.MUC_ADMIN}).cnode(f.node);return i!==null&&l.c("reason",i),m.connection.sendIQ(l.tree(),o,u)},modifyRole:function(e,t,r,i,o,u){var f=s("item",{nick:t,role:r}),l=n({to:e,type:"set"}).c("query",{xmlns:a.NS.MUC_ADMIN}).cnode(f.node);return i!==null&&l.c("reason",i),m.connection.sendIQ(l.tree(),o,u)},member:function(e,t,n,r,i){return this.setAffiliation(e,t,"member",n,r,i)},revoke:function(e,t,n,r,i){return this.setAffiliation(e,t,"none",n,r,i)},owner:function(e,t,n,r,i){return this.setAffiliation(e,t,"owner",n,r,i)},admin:function(e,t,n,r,i){return this.setAffiliation(e,t,"admin",n,r,i)},validateRoleChangeCommand:function(e,t){return t.length<1||t.length>2?(this.showStatusNotification(q('Error: the "'+e+"\" command takes two arguments, the user's nickname and optionally a reason."),!0),!1):!0},onChatRoomMessageSubmitted:function(e){var t=e.replace(/^\s*/,"").match(/^\/(.*?)(?: (.*))?$/)||[!1,"",""],n=t[2]&&t[2].splitOnce(" ")||[];switch(t[1]){case"admin":if(!this.validateRoleChangeCommand(t[1],n))break;this.setAffiliation(this.model.get("jid"),n[0],"admin",n[1],undefined,this.onCommandError.bind(this));break;case"ban":if(!this.validateRoleChangeCommand(t[1],n))break;this.setAffiliation(this.model.get("jid"),n[0],"outcast",n[1],undefined,this.onCommandError.bind(this));break;case"clear":this.clearChatRoomMessages();break;case"deop":if(!this.validateRoleChangeCommand(t[1],n))break;this.modifyRole(this.model.get("jid"),n[0],"occupant",n[1],undefined,this.onCommandError.bind(this));break;case"help":this.showHelpMessages(["<strong>/admin</strong>: "+q("Change user's affiliation to admin"),"<strong>/ban</strong>: "+q("Ban user from room"),"<strong>/clear</strong>: "+q("Remove messages"),"<strong>/deop</strong>: "+q("Change user role to occupant"),"<strong>/help</strong>: "+q("Show this menu"),"<strong>/kick</strong>: "+q("Kick user from room"),"<strong>/me</strong>: "+q("Write in 3rd person"),"<strong>/member</strong>: "+q("Grant membership to a user"),"<strong>/mute</strong>: "+q("Remove user's ability to post messages"),"<strong>/nick</strong>: "+q("Change your nickname"),"<strong>/op</strong>: "+q("Grant moderator role to user"),"<strong>/owner</strong>: "+q("Grant ownership of this room"),"<strong>/revoke</strong>: "+q("Revoke user's membership"),"<strong>/topic</strong>: "+q("Set room topic"),"<strong>/voice</strong>: "+q("Allow muted user to post messages")]);break;case"kick":if(!this.validateRoleChangeCommand(t[1],n))break;this.modifyRole(this.model.get("jid"),n[0],"none",n[1],undefined,this.onCommandError.bind(this));break;case"mute":if(!this.validateRoleChangeCommand(t[1],n))break;this.modifyRole(this.model.get("jid"),n[0],"visitor",n[1],undefined,this.onCommandError.bind(this));break;case"member":if(!this.validateRoleChangeCommand(t[1],n))break;this.setAffiliation(this.model.get("jid"),n[0],"member",n[1],undefined,this.onCommandError.bind(this));break;case"nick":m.connection.send(i({from:m.connection.jid,to:this.getRoomJIDAndNick(t[2]),id:m.connection.getUniqueId()}).tree());break;case"owner":if(!this.validateRoleChangeCommand(t[1],n))break;this.setAffiliation(this.model.get("jid"),n[0],"owner",n[1],undefined,this.onCommandError.bind(this));break;case"op":if(!this.validateRoleChangeCommand(t[1],n))break;this.modifyRole(this.model.get("jid"),n[0],"moderator",n[1],undefined,this.onCommandError.bind(this));break;case"revoke":if(!this.validateRoleChangeCommand(t[1],n))break;this.setAffiliation(this.model.get("jid"),n[0],"none",n[1],undefined,this.onCommandError.bind(this));break;case"topic":m.connection.send(r({to:this.model.get("jid"),from:m.connection.jid,type:"groupchat"}).c("subject",{xmlns:"jabber:client"}).t(t[2]).tree());break;case"voice":if(!this.validateRoleChangeCommand(t[1],n))break;this.modifyRole(this.model.get("jid"),n[0],"occupant",n[1],undefined,this.onCommandError.bind(this));break;default:this.sendChatRoomMessage(e)}},handleMUCStanza:function(e){var n,r,i,s=e.getAttribute("from"),o=t(e).find('[xmlns="'+a.NS.MAM+'"]').length>0;if(!s||this.model.get("id")!==s.split("/")[0]||o)return!0;if(e.nodeName==="message")f.compose(this.onChatRoomMessage.bind(this),this.showStatusMessages.bind(this))(e);else if(e.nodeName==="presence"){r=e.getElementsByTagName("x");if(r.length>0)for(i=0;i<r.length;i++){n=r[i].getAttribute("xmlns");if(n&&n.match(a.NS.MUC)){this.onChatRoomPresence(e);break}}}return!0},getRoomJIDAndNick:function(e){e=e||this.model.get("nick");var t=this.model.get("jid"),n=a.getNodeFromJid(t),r=a.getDomainFromJid(t);return n+"@"+r+(e!==null?"/"+e:"")},join:function(e,t,n){var r=i({from:m.connection.jid,to:this.getRoomJIDAndNick()}).c("x",{xmlns:a.NS.MUC});return typeof t=="object"&&Object.keys(t).length&&(r=r.c("history",t).up()),e&&r.cnode(a.xmlElement("password",[],e)),typeof n!="undefined"&&n!==null&&r.up.cnode(n),this.handler||(this.handler=m.connection.addHandler(this.handleMUCStanza.bind(this))),this.model.set("connection_status",a.Status.CONNECTING),m.connection.send(r)},leave:function(e){var t=m.connection.getUniqueId(),n=i({type:"unavailable",id:t,from:m.connection.jid,to:this.getRoomJIDAndNick()});e!==null&&n.c("status",e),m.connection.addHandler(function(){this.model.set("connection_status",a.Status.DISCONNECTED)}.bind(this),null,"presence",null,t),m.connection.send(n)},renderConfigurationForm:function(e){var n=this.$el.find("form.chatroom-form"),r=n.children("fieldset:first"),i=t(e),s=i.find("field"),o=i.find("title").text(),u=i.find("instructions").text();r.find("span.spinner").remove(),r.append(t("<legend>").text(o)),u&&u!==o&&r.append(t('<p class="instructions">').text(u)),f.each(s,function(e){r.append(c.xForm2webForm(t(e),i))}),n.append("<fieldset></fieldset>"),r=n.children("fieldset:last"),r.append('<input type="submit" class="pure-button button-primary" value="'+q("Save")+'"/>'),r.append('<input type="button" class="pure-button button-cancel" value="'+q("Cancel")+'"/>'),r.find("input[type=button]").on("click",this.cancelConfiguration.bind(this)),n.on("submit",this.saveConfiguration.bind(this))},sendConfiguration:function(e,t,r){var i=n({to:this.model.get("jid"),type:"set"}).c("query",{xmlns:a.NS.MUC_OWNER}).c("x",{xmlns:a.NS.XFORM,type:"submit"});return f.each(e,function(e){i.cnode(e).up()}),m.connection.sendIQ(i.tree(),t,r)},saveConfiguration:function(e){e.preventDefault();var n=this,r=t(e.target).find(":input:not([type=button]):not([type=submit])"),i=r.length,s=[];r.each(function(){s.push(c.webForm2xForm(this)),--i||n.sendConfiguration(s,n.onConfigSaved.bind(n),n.onErrorConfigSaved.bind(n))}),this.$el.find("div.chatroom-form-container").hide(function(){t(this).remove(),n.$el.find(".chat-area").removeClass("hidden"),n.$el.find(".occupants").removeClass("hidden")})},onConfigSaved:function(e){},onErrorConfigSaved:function(e){this.showStatusNotification(q("An error occurred while trying to save the form."))},cancelConfiguration:function(e){e.preventDefault();var n=this;this.$el.find("div.chatroom-form-container").hide(function(){t(this).remove(),n.$el.find(".chat-area").removeClass("hidden"),n.$el.find(".occupants").removeClass("hidden")})},configureChatRoom:function(e){e.preventDefault();if(this.$el.find("div.chatroom-form-container").length)return;this.$(".chatroom-body").children().addClass("hidden"),this.$(".chatroom-body").append(m.templates.chatroom_form()),m.connection.sendIQ(n({to:this.model.get("jid"),type:"get"}).c("query",{xmlns:a.NS.MUC_OWNER}).tree(),this.renderConfigurationForm.bind(this))},submitPassword:function(e){e.preventDefault();var t=this.$el.find(".chatroom-form").find("input[type=password]").val();this.$el.find(".chatroom-form-container").replaceWith('<span class="spinner centered"/>'),this.join(t)},renderPasswordForm:function(){this.$(".chatroom-body").children().hide(),this.$("span.centered.spinner").remove(),this.$(".chatroom-body").append(m.templates.chatroom_password_form({heading:q("This chatroom requires a password"),label_password:q("Password: "),label_submit:q("Submit")})),this.$(".chatroom-form").on("submit",this.submitPassword.bind(this))},showDisconnectMessage:function(e){this.$(".chat-area").hide(),this.$(".occupants").hide(),this.$("span.centered.spinner").remove(),this.$(".chatroom-body").append(t("<p>"+e+"</p>"))},infoMessages:{100:q("This room is not anonymous"),102:q("This room now shows unavailable members"),103:q("This room does not show unavailable members"),104:q("Non-privacy-related room configuration has changed"),170:q("Room logging is now enabled"),171:q("Room logging is now disabled"),172:q("This room is now non-anonymous"),173:q("This room is now semi-anonymous"),174:q("This room is now fully-anonymous"),201:q("A new room has been created")},disconnectMessages:{301:q("You have been banned from this room"),307:q("You have been kicked from this room"),321:q("You have been removed from this room because of an affiliation change"),322:q("You have been removed from this room because the room has changed to members-only and you're not a member"),332:q("You have been removed from this room because the MUC (Multi-user chat) service is being shut down.")},actionInfoMessages:{301:R("<strong>%1$s</strong> has been banned"),303:R("<strong>%1$s</strong>'s nickname has changed"),307:R("<strong>%1$s</strong> has been kicked out"),321:R("<strong>%1$s</strong> has been removed because of an affiliation change"),322:R("<strong>%1$s</strong> has been removed for not being a member")},newNicknameMessages:{210:R("Your nickname has been automatically changed to: <strong>%1$s</strong>"),303:R("Your nickname has been changed to: <strong>%1$s</strong>")},showStatusMessages:function(e,n){var r=t(e),i=[],s=[],o=[];r.find('x[xmlns="'+a.NS.MUC_USER+'"]').each(function(e,u){var l=t(u).find("item");a.getBareJidFromJid(l.attr("jid"))===m.bare_jid&&l.attr("affiliation")==="owner"&&this.$el.find("a.configure-chatroom-button").show(),t(u).find("item reason").each(function(e,n){t(n).text()&&o.push(t(n).text())}),t(u).find("status").each(function(e,o){var u=o.getAttribute("code"),c=a.unescapeNode(a.getResourceFromJid(r.attr("from")));n&&u==="210"?s.push(q(this.newNicknameMessages[u],c)):n&&u==="303"?s.push(q(this.newNicknameMessages[u],l.attr("nick"))):n&&f.contains(f.keys(this.disconnectMessages),u)?i.push(this.disconnectMessages[u]):!n&&f.contains(f.keys(this.actionInfoMessages),u)?s.push(q(this.actionInfoMessages[u],c)):f.contains(f.keys(this.infoMessages),u)?s.push(this.infoMessages[u]):u!=="110"&&t(o).text()&&s.push(t(o).text())}.bind(this))}.bind(this));if(i.length>0){for(w=0;w<i.length;w++)this.showDisconnectMessage(i[w]);for(w=0;w<o.length;w++)this.showDisconnectMessage(q('The reason given is: "'+o[w]+'"'),!0);this.model.set("connection_status",a.Status.DISCONNECTED);return}for(w=0;w<s.length;w++)this.$content.append(m.templates.info({message:s[w]}));for(w=0;w<o.length;w++)this.showStatusNotification(q('The reason given is: "'+o[w]+'"'),!0);return this.scrollDown(),e},showErrorMessage:function(e){e.attr("type")==="auth"?e.find("not-authorized").length?this.renderPasswordForm():e.find("registration-required").length?this.showDisconnectMessage(q("You are not on the member list of this room")):e.find("forbidden").length&&this.showDisconnectMessage(q("You have been banned from this room")):e.attr("type")==="modify"?e.find("jid-malformed").length&&this.showDisconnectMessage(q("No nickname was specified")):e.attr("type")==="cancel"&&(e.find("not-allowed").length?this.showDisconnectMessage(q("You are not allowed to create new rooms")):e.find("not-acceptable").length?this.showDisconnectMessage(q("Your nickname doesn't conform to this room's policies")):e.find("conflict").length?this.showDisconnectMessage(q("Your nickname is already taken")):e.find("item-not-found").length?this.showDisconnectMessage(q("This room does not (yet) exist")):e.find("service-unavailable").length&&this.showDisconnectMessage(q("This room has reached it's maximum number of occupants")))},onChatRoomPresence:function(e){var n=t(e),r,i=this.model.get("nick");n.attr("type")==="error"?(this.model.set("connection_status",a.Status.DISCONNECTED),this.showErrorMessage(n.find("error"))):(r=n.find("status[code='110']").length||n.attr("from")===this.model.get("id")+"/"+a.escapeNode(i),this.model.get("connection_status")!==a.Status.CONNECTED&&this.model.set("connection_status",a.Status.CONNECTED),this.showStatusMessages(e,r)),this.occupantsview.updateOccupantsOnPresence(e)},onChatRoomMessage:function(e){var n=t(e),r=n.find('result[xmlns="'+a.NS.MAM+'"]').attr("id"),i=n.find("delay").length>0,s=n.find("forwarded"),o;s.length&&(n=s.children("message"),o=s.children("delay"),i=o.length>0);var u=n.children("body").text(),f=n.attr("from"),l=n.attr("id"),c=a.getResourceFromJid(f),h=c&&a.unescapeNode(c)||"",p=n.children("subject").text();return l&&this.model.messages.findWhere({msgid:l})?!0:(p&&(this.$el.find(".chatroom-topic").text(p).attr("title",p),this.$content.append(m.templates.info({message:q("Topic set by %1$s to: %2$s",h,p)}))),h===""?!0:(this.model.createMessage(n,o,r),!i&&h!==this.model.get("nick")&&(new RegExp("\\b"+this.model.get("nick")+"\\b")).test(u)&&m.playNotification(),h!==this.model.get("nick")&&m.emit("message",e),!0))}}),this.ChatBoxes=Backbone.Collection.extend({model:m.ChatBox,comparator:"time_opened",registerMessageHandler:function(){m.connection.addHandler(function(e){return this.onMessage(e),!0}.bind(this),null,"message","chat"),m.connection.addHandler(function(e){return this.onInvite(e),!0}.bind(this),"jabber:x:conference","message")},onConnected:function(){this.browserStorage=new Backbone.BrowserStorage[m.storage](h("converse.chatboxes-"+m.bare_jid)),this.registerMessageHandler(),this.fetch({add:!0,success:function(e,t){e.each(function(e){e.get("id")!=="controlbox"&&!e.get("minimized")&&e.trigger("show")}),f.include(f.pluck(t,"id"),"controlbox")||this.add({id:"controlbox",box_id:"controlbox"}),this.get("controlbox").save({connected:!0})}.bind(this)})},isOnlyChatStateNotification:function(e){return e.find("body").length===0&&(e.find(M).length!==0||e.find(D).length!==0||e.find(O).length!==0||e.find(P).length!==0||e.find(H).length!==0)},onInvite:function(e){var n=t(e),r=n.children('x[xmlns="jabber:x:conference"]'),i=a.getBareJidFromJid(n.attr("from")),s=r.attr("jid"),o=r.attr("reason"),u=m.roster.get(i),l;o?l=confirm(q(R('%1$s has invited you to join a chat room: %2$s, and left the following reason: "%3$s"'),u.get("fullname"),s,o)):l=confirm(q(R("%1$s has invited you to join a chat room: %2$s"),u.get("fullname"),s));if(l===!0){var c=m.chatboxviews.showChat({id:s,jid:s,name:a.unescapeNode(a.getNodeFromJid(s)),nick:a.unescapeNode(a.getNodeFromJid(m.connection.jid)),chatroom:!0,box_id:h(s),password:r.attr("password")});f.contains([a.Status.CONNECTING,a.Status.CONNECTED],c.get("connection_status"))||m.chatboxviews.get(s).join(null)}},onMessage:function(e){var n=t(e),r,i,s,o,u,f,l,c,h,p=n.attr("from"),d=n.attr("to"),v=a.getResourceFromJid(d),g=n.find('result[xmlns="'+a.NS.MAM+'"]').attr("id");return v&&v!==m.resource?(m.log("Ignore incoming message intended for a different resource: "+d,"info"),!0):p===m.connection.jid?(m.log("Ignore incoming message sent from this client's JID: "+p,"info"),!0):(i=n.find("forwarded"),i.length&&(n=i.children("message"),s=i.children("delay"),p=n.attr("from"),d=n.attr("to")),o=a.getBareJidFromJid(p),u=a.getResourceFromJid(p),f=o===m.bare_jid,l=n.attr("id"),f?(r=a.getBareJidFromJid(d),h=a.getResourceFromJid(d)):(r=o,h=u),c=this.getChatBox(r,n.find("body").length>0),c?l&&c.messages.findWhere({msgid:l})?!0:(!this.isOnlyChatStateNotification(n)&&!f&&!i.length&&m.playNotification(),c.receiveMessage(n,s,g),m.roster.addResource(r,h),m.emit("message",e),!0):!0)},getChatBox:function(e,t){var n=a.getBareJidFromJid(e),r=this.get(n);if(!r&&t){var i=m.roster.get(n);if(i===undefined){m.log("Could not get roster item for JID "+n,"error");return}r=this.create({id:n,jid:n,fullname:f.isEmpty(i.get("fullname"))?e:i.get("fullname"),image_type:i.get("image_type"),image:i.get("image"),url:i.get("url")})}return r}}),this.ChatBoxViews=Backbone.Overview.extend({initialize:function(){this.model.on("add",this.onChatBoxAdded,this),this.model.on("change:minimized",function(e){e.get("minimized")===!0?this.trimChats():this.trimChats(this.get(e.get("id")))},this)},_ensureElement:function(){if(!this.el){var e=t("#conversejs");e.length||(e=t('<div id="conversejs">'),t("body").append(e)),e.html(m.templates.chats_panel()),this.setElement(e,!1)}else this.setElement(f.result(this,"el"),!1)},onChatBoxAdded:function(e){var t=this.get(e.get("id"));t?(delete t.model,t.model=e,t.initialize()):(e.get("chatroom")?t=new m.ChatRoomView({model:e}):e.get("box_id")==="controlbox"?t=new m.ControlBoxView({model:e}):t=new m.ChatBoxView({model:e}),this.add(e.get("id"),t)),this.trimChats(t)},trimChats:function(e){if(m.no_trimming||this.model.length<=1)return;var n,r=0,i=m.minimized_chats.$el,s=f.contains(this.model.pluck("minimized"),!0)?i.outerWidth(!0):0,o=e?e.$el.outerWidth(!0):0,u=e?e.model.get("id"):null,a=this.get("controlbox");!a||!a.$el.is(":visible")?r=m.controlboxtoggle.$el.outerWidth(!0):r=a.$el.outerWidth(!0),f.each(this.getAll(),function(e){var t=e.model.get("id");t!=="controlbox"&&t!==u&&!e.model.get("minimized")&&e.$el.is(":visible")&&(o+=e.$el.outerWidth(!0))}),s+o+r>t("body").outerWidth(!0)&&(n=this.getOldestMaximizedChat(),n&&n.get("id")!==u&&n.minimize())},getOldestMaximizedChat:function(){var e=0,t=this.model.sort().at(e);while(t.get("id")==="controlbox"||t.get("minimized")===!0){e++,t=this.model.at(e);if(!t)return null}return t},closeAllChatBoxes:function(e){var t=[];return this.model.each(function(n){var r=n.get("id");(e||r!=="controlbox")&&t.push(r)}),t.forEach(function(e){var t=this.get(e);t&&t.close()},this),this},showChat:function(e){var t=this.model.get(e.jid);return t||(t=this.model.create(e,{error:function(e,t){m.log(t.responseText)}})),t.get("minimized")?t.maximize():t.trigger("show"),t}}),this.MinimizedChatBoxView=Backbone.View.extend({tagName:"div",className:"chat-head",events:{"click .close-chatbox-button":"close","click .restore-chat":"restore"},initialize:function(){this.model.messages.on("add",function(e){e.get("message")&&this.updateUnreadMessagesCounter()},this),this.model.on("change:minimized",this.clearUnreadMessagesCounter,this),this.model.on("showReceivedOTRMessage",this.updateUnreadMessagesCounter,this),this.model.on("showSentOTRMessage",this.updateUnreadMessagesCounter,this)},render:function(){var e=f.extend(this.model.toJSON(),{tooltip:q("Click to restore this chat")});return this.model.get("chatroom")?(e.title=this.model.get("name"),this.$el.addClass("chat-head-chatroom")):(e.title=this.model.get("fullname"),this.$el.addClass("chat-head-chatbox")),this.$el.html(m.templates.trimmed_chat(e))},clearUnreadMessagesCounter:function(){this.model.set({num_unread:0}),this.render()},updateUnreadMessagesCounter:function(){this.model.set({num_unread:this.model.get("num_unread")+1}),this.render()},close:function(e){return e&&e.preventDefault&&e.preventDefault(),this.remove(),this.model.destroy(),m.emit("chatBoxClosed",this),this},restore:f.debounce(function(e){e&&e.preventDefault&&e.preventDefault(),this.model.messages.off("add",null,this),this.remove(),this.model.maximize()},200,!0)}),this.MinimizedChats=Backbone.Overview.extend({el:"#minimized-chats",events:{"click #toggle-minimized-chats":"toggle"},initialize:function(){this.initToggle(),this.model.on("add",this.onChanged,this),this.model.on("destroy",this.removeChat,this),this.model.on("change:minimized",this.onChanged,this),this.model.on("change:num_unread",this.updateUnreadMessagesCounter,this)},tearDown:function(){return this.model.off("add",this.onChanged),this.model.off("destroy",this.removeChat),this.model.off("change:minimized",this.onChanged),this.model.off("change:num_unread",this.updateUnreadMessagesCounter),this},initToggle:function(){this.toggleview=new m.MinimizedChatsToggleView({model:new m.MinimizedChatsToggle});var e=h("converse.minchatstoggle"+m.bare_jid);this.toggleview.model.id=e,this.toggleview.model.browserStorage=new Backbone.BrowserStorage[m.storage](e),this.toggleview.model.fetch()},render:function(){return this.keys().length===0?this.$el.hide("fast"):this.keys().length===1&&this.$el.show("fast"),this.$el},toggle:function(e){e&&e.preventDefault&&e.preventDefault(),this.toggleview.model.save({collapsed:!this.toggleview.model.get("collapsed")}),this.$(".minimized-chats-flyout").toggle()},onChanged:function(e){e.get("id")!=="controlbox"&&e.get("minimized")?this.addChat(e):this.get(e.get("id"))&&this.removeChat(e)},addChat:function(e){var t=this.get(e.get("id"));if(t&&t.$el.parent().length!==0)return;var n=new m.MinimizedChatBoxView({model:e});this.$(".minimized-chats-flyout").append(n.render()),this.add(e.get("id"),n),this.toggleview.model.set({num_minimized:this.keys().length}),this.render()},removeChat:function(e){this.remove(e.get("id")),this.toggleview.model.set({num_minimized:this.keys().length}),this.render()},updateUnreadMessagesCounter:function(){var e=this.model.pluck("num_unread"),t=0,n;for(n=0;n<e.length;n++)t+=e[n];this.toggleview.model.set({num_unread:t}),this.render()}}),this.MinimizedChatsToggle=Backbone.Model.extend({initialize:function(){this.set({collapsed:this.get("collapsed")||!1,num_minimized:this.get("num_minimized")||0,num_unread:this.get("num_unread")||0})}}),this.MinimizedChatsToggleView=Backbone.View.extend({el:"#toggle-minimized-chats",initialize:function(){this.model.on("change:num_minimized",this.render,this),this.model.on("change:num_unread",this.render,this),this.$flyout=this.$el.siblings(".minimized-chats-flyout")},render:function(){return this.$el.html(m.templates.toggle_chats(f.extend(this.model.toJSON(),{Minimized:q("Minimized")}))),this.model.get("collapsed")?this.$flyout.hide():this.$flyout.show(),this.$el}}),this.RosterContact=Backbone.Model.extend({initialize:function(e,t){var n=e.jid,r=a.getBareJidFromJid(n),i=a.getResourceFromJid(n);e.jid=r,this.set(f.extend({id:r,jid:r,fullname:r,chat_status:"offline",user_id:a.getNodeFromJid(n),resources:i?[i]:[],groups:[],image_type:"image/png",image:"iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAIAAABt+uBvAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gwHCy455JBsggAABkJJREFUeNrtnM1PE1sUwHvvTD8otWLHST/Gimi1CEgr6M6FEWuIBo2pujDVsNDEP8GN/4MbN7oxrlipG2OCgZgYlxAbkRYw1KqkIDRCSkM7nXvvW8x7vjyNeQ9m7p1p3z1LQk/v/Dhz7vkEXL161cHl9wI5Ag6IA+KAOCAOiAPigDggLhwQB2S+iNZ+PcYY/SWEEP2HAAAIoSAIoihCCP+ngDDGtVotGAz29/cfOXJEUZSOjg6n06lp2sbGRqlUWlhYyGazS0tLbrdbEASrzgksyeYJId3d3el0uqenRxRFAAAA4KdfIIRgjD9+/Pj8+fOpqSndslofEIQwHA6Pjo4mEon//qmFhYXHjx8vLi4ihBgDEnp7e9l8E0Jo165dQ0NDd+/eDYVC2/qsJElDQ0OEkKWlpa2tLZamxAhQo9EIBoOjo6MXL17csZLe3l5FUT59+lQul5l5JRaAVFWNRqN37tw5ceKEQVWRSOTw4cOFQuHbt2+iKLYCIISQLMu3b99OJpOmKAwEAgcPHszn8+vr6wzsiG6UQQhxuVyXLl0aGBgwUW0sFstkMl6v90fo1KyAMMYDAwPnzp0zXfPg4GAqlWo0Gk0MiBAiy/L58+edTqf5Aa4onj59OhaLYYybFRCEMBaL0fNxBw4cSCQStN0QRUBut3t4eJjq6U+dOiVJElVPRBFQIBDo6+ujCqirqyscDlONGykC2lYyYSR6pBoQQapHZwAoHo/TuARYAOrs7GQASFEUqn6aIiBJkhgA6ujooFpUo6iaTa7koFwnaoWadLNe81tbWwzoaJrWrICWl5cZAFpbW6OabVAEtLi4yABQsVjUNK0pAWWzWQaAcrlcswKanZ1VVZUqHYRQEwOq1Wpv3ryhCmh6erpcLjdrNl+v1ycnJ+l5UELI27dvv3//3qxxEADgy5cvExMT9Mznw4cPtFtAdAPFarU6Pj5eKpVM17yxsfHy5cvV1VXazXu62gVBKBQKT58+rdVqJqrFGL948eLdu3dU8/g/H4FBUaJYLAqC0NPTY9brMD4+PjY25mDSracOCABACJmZmXE6nUePHjWu8NWrV48ePSKEsGlAs7Agfd5nenq6Wq0mk0kjDzY2NvbkyRMIIbP2PLvhBUEQ8vl8NpuNx+M+n29bzhVjvLKycv/+/YmJCcazQuwA6YzW1tYmJyf1SY+2trZ/rRk1Go1SqfT69esHDx4UCgVmNaa/zZ/9ABUhRFXVYDB48uTJeDweiUQkSfL7/T9MA2NcqVTK5fLy8vL8/PzU1FSxWHS5XJaM4wGr9sUwxqqqer3eUCgkSZJuUBBCfTRvc3OzXC6vrKxUKhWn02nhCJ5lM4oQQo/HgxD6+vXr58+fHf8sDOp+HQDg8XgclorFU676dKLlo6yWRdItIBwQB8QBcUCtfosRQjRNQwhhjPUC4w46WXryBSHU1zgEQWBz99EFhDGu1+t+v//48ePxeFxRlD179ng8nh0Efgiher2+vr6ur3HMzMysrq7uTJVdACGEurq6Ll++nEgkPB7Pj9jPoDHqOxyqqubz+WfPnuVyuV9XPeyeagAAAoHArVu3BgcHab8CuVzu4cOHpVKJUnfA5GweY+xyuc6cOXPv3r1IJMLAR8iyPDw8XK/Xi8Wiqqqmm5KZgBBC7e3tN27cuHbtGuPVpf7+/lAoNDs7W61WzfVKpgHSSzw3b95MpVKW3MfRaDQSiczNzVUqFRMZmQOIEOL1eq9fv3727FlL1t50URRFluX5+flqtWpWEGAOIFEUU6nUlStXLKSjy759+xwOx9zcnKZpphzGHMzhcDiTydgk9r1w4YIp7RPTAAmCkMlk2FeLf/tIEKbTab/fbwtAhJBoNGrutpNx6e7uPnTokC1eMU3T0um0DZPMkZER6wERQnw+n/FFSxpy7Nix3bt3WwwIIcRgIWnHkkwmjecfRgGx7DtuV/r6+iwGhDHev3+/bQF1dnYaH6E2CkiWZdsC2rt3r8WAHA5HW1ubbQGZcjajgOwTH/4qNko1Wlg4IA6IA+KAOKBWBUQIsfNojyliKIoRRfH9+/dut9umf3wzpoUNNQ4BAJubmwz+ic+OxefzWWlBhJD29nbug7iT5sIBcUAcEAfEAXFAHBAHxOVn+QMrmWpuPZx12gAAAABJRU5ErkJggg==",status:""},e)),this.on("destroy",function(){this.removeFromRoster()}.bind(this))},subscribe:function(e){this.save("ask","subscribe");var t=i({to:this.get("jid"),type:"subscribe"});e&&e!==""&&t.c("status").t(e).up();var n=m.xmppstatus.get("fullname");return n&&n!==""&&t.c("nick",{xmlns:a.NS.NICK}).t(n).up(),m.connection.send(t),this},ackSubscribe:function(){m.connection.send(i({type:"subscribe",to:this.get("jid")}))},ackUnsubscribe:function(e){m.connection.send(i({type:"unsubscribe",to:this.get("jid")})),this.destroy()},unauthorize:function(e){return m.rejectPresenceSubscription(this.get("jid"),e),this},authorize:function(e){var t=i({to:this.get("jid"),type:"subscribed"});return e&&e!==""&&t.c("status").t(e),m.connection.send(t),this},removeResource:function(e){var t=this.get("resources"),n;return e&&(n=f.indexOf(t,e),n!==-1&&(t.splice(n,1),this.save({resources:t}))),t.length},removeFromRoster:function(e){var t=n({type:"set"}).c("query",{xmlns:a.NS.ROSTER}).c("item",{jid:this.get("jid"),subscription:"remove"});return m.connection.sendIQ(t,e,e),this},showInRoster:function(){var e=this.get("chat_status");return m.show_only_online_users&&e!=="online"||m.hide_offline_users&&e==="offline"?this.get("ask")==="subscribe"||this.get("subscription")==="from"||this.get("requesting")===!0?!0:!1:!0}}),this.RosterContactView=Backbone.View.extend({tagName:"dd",events:{"click .accept-xmpp-request":"acceptRequest","click .decline-xmpp-request":"declineRequest","click .open-chat":"openChat","click .remove-xmpp-contact":"removeContact"},initialize:function(){this.model.on("change",this.render,this),this.model.on("remove",this.remove,this),this.model.on("destroy",this.remove,this),this.model.on("open",this.openChat,this)},render:function(){if(!this.model.showInRoster())return this.$el.hide(),this;this.$el[0].style.display==="none"&&this.$el.show();var e=this.model,t=e.get("ask"),n=e.get("chat_status"),r=e.get("requesting"),i=e.get("subscription"),s=["current-xmpp-contact","pending-xmpp-contact","requesting-xmpp-contact"].concat(f.keys(W));f.each(s,function(e){this.el.className.indexOf(e)!==-1&&this.$el.removeClass(e)},this),this.$el.addClass(n).data("status",n);if(t==="subscribe"||i==="from")this.$el.addClass("pending-xmpp-contact"),this.$el.html(m.templates.pending_contact(f.extend(e.toJSON(),{desc_remove:q("Click to remove this contact"),allow_chat_pending_contacts:m.allow_chat_pending_contacts})));else if(r===!0)this.$el.addClass("requesting-xmpp-contact"),this.$el.html(m.templates.requesting_contact(f.extend(e.toJSON(),{desc_accept:q("Click to accept this contact request"),desc_decline:q("Click to decline this contact request"),allow_chat_pending_contacts:m.allow_chat_pending_contacts}))),m.controlboxtoggle.showControlBox();else if(i==="both"||i==="to")this.$el.addClass("current-xmpp-contact"),this.$el.removeClass(f.without(["both","to"],i)[0]).addClass(i),this.$el.html(m.templates.roster_item(f.extend(e.toJSON(),{desc_status:W[n||"offline"],desc_chat:q("Click to chat with this contact"),desc_remove:q("Click to remove this contact"),title_fullname:q("Name"),allow_contact_removal:m.allow_contact_removal})));return this},openChat:function(e){return e&&e.preventDefault&&e.preventDefault(),m.chatboxviews.showChat(this.model.attributes)},removeContact:function(e){e&&e.preventDefault&&e.preventDefault();if(!m.allow_contact_removal)return;var t=confirm(q("Are you sure you want to remove this contact?"));if(t===!0){var r=n({type:"set"}).c("query",{xmlns:a.NS.ROSTER}).c("item",{jid:this.model.get("jid"),subscription:"remove"});m.connection.sendIQ(r,function(e){this.model.destroy(),this.remove()}.bind(this),function(e){alert(q("Sorry, there was an error while trying to remove "+name+" as a contact.")),m.log(e)})}},acceptRequest:function(e){e&&e.preventDefault&&e.preventDefault(),m.roster.sendContactAddIQ(this.model.get("jid"),this.model.get("fullname"),[],function(){this.model.authorize().subscribe()}.bind(this))},declineRequest:function(e){e&&e.preventDefault&&e.preventDefault();var t=confirm(q("Are you sure you want to decline this contact request?"));return t===!0&&this.model.unauthorize().destroy(),this}}),this.RosterContacts=Backbone.Collection.extend({model:m.RosterContact,comparator:function(e,t){var n,r,i=e.get("chat_status")||"offline",s=t.get("chat_status")||"offline";return g[i]===g[s]?(n=e.get("fullname").toLowerCase(),r=t.get("fullname").toLowerCase(),n<r?-1:n>r?1:0):g[i]<g[s]?-1:1},subscribeToSuggestedItems:function(e){return t(e).find("item").each(function(e,t){this.getAttribute("action")==="add"&&m.roster.addAndSubscribe(this.getAttribute("jid"),null,m.xmppstatus.get("fullname"))}),!0},isSelf:function(e){return a.getBareJidFromJid(e)===a.getBareJidFromJid(m.connection.jid)},addAndSubscribe:function(e,t,n,r,i){this.addContact(e,t,n,i).done(function(e){e instanceof m.RosterContact&&e.subscribe(r)})},sendContactAddIQ:function(e,t,r,i,s){t=f.isEmpty(t)?e:t;var o=n({type:"set"}).c("query",{xmlns:a.NS.ROSTER}).c("item",{jid:e,name:t});f.map(r,function(e){o.c("group").t(e).up()}),m.connection.sendIQ(o,i,s)},addContact:function(e,n,r,i){var s=new t.Deferred;return r=r||[],n=f.isEmpty(n)?e:n,this.sendContactAddIQ(e,n,r,function(t){var o=this.create(f.extend({ask:undefined,fullname:n,groups:r,jid:e,requesting:!1,subscription:"none"},i),{sort:!1});s.resolve(o)}.bind(this),function(e){alert(q("Sorry, there was an error while trying to add "+n+" as a contact.")),m.log(e),s.resolve(e)}),s.promise()},addResource:function(e,t){var n=this.get(e),r;n&&(r=n.get("resources"),r?f.indexOf(r,t)===-1&&(r.push(t),n.set({resources:r})):n.set({resources:[t]}))},subscribeBack:function(e){var t=this.get(e);t instanceof m.RosterContact?t.authorize().subscribe():this.addContact(e,"",[],{subscription:"from"}).done(function(e){e instanceof m.RosterContact&&e.authorize().subscribe()})},getNumOnlineContacts:function(){var e=0,t=["offline","unavailable"],n=this.models,r=n.length,i;m.show_only_online_users&&(t=f.union(t,["dnd","xa","away"]));for(i=0;i<r;i++)f.indexOf(t,n[i].get("chat_status"))===-1&&e++;return e},onRosterPush:function(e){var r=e.getAttribute("id"),i=e.getAttribute("from");return i&&i!==""&&a.getBareJidFromJid(i)!==m.bare_jid?(m.connection.send(n({type:"error",id:r,from:m.connection.jid}).c("error",{type:"cancel"}).c("service-unavailable",{xmlns:a.NS.ROSTER})),!0):(m.connection.send(n({type:"result",id:r,from:m.connection.jid})),t(e).children("query").find("item").each(function(e,t){this.updateContact(t)}.bind(this)),m.emit("rosterPush",e),!0)},fetchFromServer:function(e,t){var r=n({type:"get",id:m.connection.getUniqueId("roster")}).c("query",{xmlns:a.NS.ROSTER});return m.connection.sendIQ(r,this.onReceivedFromServer.bind(this))},onReceivedFromServer:function(e){m.emit("roster",e),t(e).children("query").find("item").each(function(e,t){this.updateContact(t)}.bind(this)),m.initial_presence_sent||(m.initial_presence_sent=1,m.xmppstatus.sendPresence())},updateContact:function(e){var n=e.getAttribute("jid");if(this.isSelf(n))return;var r=[],i=this.get(n),s=e.getAttribute("ask"),o=e.getAttribute("subscription");t.map(e.getElementsByTagName("group"),function(e){r.push(a.getText(e))});if(!i){if(o==="none"&&s===null||o==="remove")return;this.create({ask:s,fullname:e.getAttribute("name")||n,groups:r,jid:n,subscription:o},{sort:!1})}else{if(o==="remove")return i.destroy();i.save({subscription:o,ask:s,requesting:null,groups:r})}},createContactFromVCard:function(e,t,n,r,i,s){var o=a.getBareJidFromJid(t);this.create({jid:o,subscription:"none",ask:null,requesting:!0,fullname:n||o,image:r,image_type:i,url:s,vcard_updated:l().format()})},handleIncomingSubscription:function(e){var t=a.getBareJidFromJid(e),n=this.get(t);m.allow_contact_requests||m.rejectPresenceSubscription(e,q("This client does not allow presence subscriptions")),m.auto_subscribe?!n||n.get("subscription")!=="to"?this.subscribeBack(t):n.authorize():n?n.get("subscription")!=="none"?n.authorize():n.get("ask")==="subscribe"&&n.authorize():n||m.getVCard(t,this.createContactFromVCard.bind(this),function(e,t){m.log("Error while retrieving vcard for "+t),this.createContactFromVCard.call(this,e,t)}.bind(this))},presenceHandler:function(e){var n=t(e),r=e.getAttribute("type");if(r==="error")return!0;var i=e.getAttribute("from"),s=a.getBareJidFromJid(i),o=a.getResourceFromJid(i),u=n.find("show").text()||"online",f=n.find("status"),l=this.get(s);if(this.isSelf(s)){m.connection.jid!==i&&r!=="unavailable"&&(m.xmppstatus.save({status:u}),f.length&&m.xmppstatus.save({status_message:f.text()}));return}if((n.find("x").attr("xmlns")||"").indexOf(a.NS.MUC)===0)return;l&&f.text()!==l.get("status")&&l.save({status:f.text()});if(r==="subscribed"&&l)l.ackSubscribe();else if(r==="unsubscribed"&&l)l.ackUnsubscribe();else{if(r==="unsubscribe")return;r==="subscribe"?this.handleIncomingSubscription(i):r==="unavailable"&&l?l.removeResource(o)===0&&l.save({chat_status:"offline"}):l&&(this.addResource(s,o),l.save({chat_status:u}))}}}),this.RosterGroup=Backbone.Model.extend({initialize:function(e,t){this.set(f.extend({description:X,state:F},e)),this.contacts=new m.RosterContacts}}),this.RosterGroupView=Backbone.Overview.extend({tagName:"dt",className:"roster-group",events:{"click a.group-toggle":"toggle"},initialize:function(){this.model.contacts.on("add",this.addContact,this),this.model.contacts.on("change:subscription",this.onContactSubscriptionChange,this),this.model.contacts.on("change:requesting",this.onContactRequestChange,this),this.model.contacts.on("change:chat_status",function(e){this.model.contacts.sort(),this.positionContact(e).render()},this),this.model.contacts.on("destroy",this.onRemove,this),this.model.contacts.on("remove",this.onRemove,this),m.roster.on("change:groups",this.onContactGroupChange,this)},render:function(){return this.$el.attr("data-group",this.model.get("name")),this.$el.html(t(m.templates.group_header({label_group:this.model.get("name"),desc_group_toggle:this.model.get("description"),toggle_state:this.model.get("state")}))),this},addContact:function(e){var t=new m.RosterContactView({model:e});this.add(e.get("id"),t),t=this.positionContact(e).render(),e.showInRoster()&&(this.model.get("state")===I?(t.$el[0].style.display!=="none"&&t.$el.hide(),this.$el.is(":visible")||this.$el.show()):this.$el[0].style.display!=="block"&&this.show())},positionContact:function(e){var t=this.get(e.get("id")),n=this.model.contacts.indexOf(e);return t.$el.detach(),n===0?this.$el.after(t.$el):n===this.model.contacts.length-1?this.$el.nextUntil("dt").last().after(t.$el):this.$el.nextUntil("dt").eq(n).before(t.$el),t},show:function(){this.$el.show(),f.each(this.getAll(),function(e){e.model.showInRoster()&&e.$el.show()})},hide:function(){this.$el.nextUntil("dt").addBack().hide()},filter:function(e){var t;e.length===0?(this.model.get("state")===F&&this.model.contacts.each(function(e){e.showInRoster()&&this.get(e.get("id")).$el.show()}.bind(this)),this.showIfNecessary()):(e=e.toLowerCase(),t=this.model.contacts.filter(p.not("fullname",e)),t.length===this.model.contacts.length?this.hide():(f.each(t,function(e){this.get(e.get("id")).$el.hide()}.bind(this)),f.each(this.model.contacts.reject(p.not("fullname",e)),function(e){this.get(e.get("id")).$el.show()}.bind(this)),this.showIfNecessary()))},showIfNecessary:function(){!this.$el.is(":visible")&&this.model.contacts.length>0&&this.$el.show()},toggle:function(e){e&&e.preventDefault&&e.preventDefault();var n=t(e.target);n.hasClass("icon-opened")?(this.$el.nextUntil("dt").slideUp(),this.model.save({state:I}),n.removeClass("icon-opened").addClass("icon-closed")):(n.removeClass("icon-closed").addClass("icon-opened"),this.model.save({state:F}),this.filter(m.rosterview.$(".roster-filter").val(),m.rosterview.$(".filter-type").val()))},onContactGroupChange:function(e){var t=f.contains(e.get("groups"),this.model.get("name")),n=e.get("id"),r=!this.get(n);t&&!r?this.model.contacts.remove(n):!t&&r&&this.addContact(e)},onContactSubscriptionChange:function(e){this.model.get("name")===J&&e.get("subscription")!=="from"&&this.model.contacts.remove(e.get("id"))},onContactRequestChange:function(e){this.model.get("name")===K&&!e.get("requesting")&&this.model.contacts.remove(e.get("id"))},onRemove:function(e){this.remove(e.get("id")),this.model.contacts.length===0&&this.$el.hide()}}),this.RosterGroups=Backbone.Collection.extend({model:m.RosterGroup,comparator:function(e,t){e=e.get("name"),t=t.get("name");var n=f.keys(Z),r=f.contains(n,e),i=f.contains(n,t);if(!r&&!i)return e.toLowerCase()<t.toLowerCase()?-1:e.toLowerCase()>t.toLowerCase()?1:0;if(r&&i)return Z[e]<Z[t]?-1:Z[e]>Z[t]?1:0;if(!r&&i)return t===V?1:-1;if(r&&!i)return e===V?-1:1}}),this.RosterView=Backbone.Overview.extend({tagName:"div",id:"converse-roster",events:{"keydown .roster-filter":"liveFilter","click .onX":"clearFilter","mousemove .x":"togglePointer","change .filter-type":"changeFilterType"},initialize:function(){this.roster_handler_ref=this.registerRosterHandler(),this.rosterx_handler_ref=this.registerRosterXHandler(),this.presence_ref=this.registerPresenceHandler(),m.roster.on("add",this.onContactAdd,this),m.roster.on("change",this.onContactChange,this),m.roster.on("destroy",this.update,this),m.roster.on("remove",this.update,this),this.model.on("add",this.onGroupAdd,this),this.model.on("reset",this.reset,this),this.$roster=t('<dl class="roster-contacts" style="display: none;"></dl>')},unregisterHandlers:function(){m.connection.deleteHandler(this.roster_handler_ref),delete this.roster_handler_ref,m.connection.deleteHandler(this.rosterx_handler_ref),delete this.rosterx_handler_ref,m.connection.deleteHandler(this.presence_ref),delete this.presence_ref},update:f.debounce(function(){var e=t("#online-count");return e.text("("+m.roster.getNumOnlineContacts()+")"),e.is(":visible")||e.show(),this.$roster.parent().length===0&&this.$el.append(this.$roster.show()),this.showHideFilter()},m.animate?100:0),render:function(){return this.$el.html(m.templates.roster({placeholder:q("Type to filter"),label_contacts:G,label_groups:Y})),m.allow_contact_requests||this.$el.addClass("no-contact-requests"),this},fetch:function(){return this.model.fetch({silent:!0,success:function(e,t,n){e.length!==0&&this.positionFetchedGroups(e,t,n),m.roster.fetch({add:!0,success:function(e){e.length>0?m.initial_presence_sent=1:m.roster.fetchFromServer()}})}.bind(this)}),this},changeFilterType:function(e){e&&e.preventDefault&&e.preventDefault(),this.clearFilter(),this.filter(this.$(".roster-filter").val(),e.target.value)},tog:function(e){return e?"addClass":"removeClass"},togglePointer:function(e){e&&e.preventDefault&&e.preventDefault();var n=e.target;t(n)[this.tog(n.offsetWidth-18<e.clientX-n.getBoundingClientRect().left)]("onX")},filter:function(e,t){e=e.toLowerCase(),t==="groups"?f.each(this.getAll(),function(t,n){t.model.get("name").toLowerCase().indexOf(e.toLowerCase())===-1?t.hide():t.model.contacts.length>0&&t.show()}):f.each(this.getAll(),function(n){n.filter(e,t)})},liveFilter:f.debounce(function(e){e&&e.preventDefault&&e.preventDefault();var t=this.$(".roster-filter"),n=t.val(),r=this.$(".filter-type").val();t[this.tog(n)]("x"),this.filter(n,r)},300),clearFilter:function(e){e&&e.preventDefault&&(e.preventDefault(),t(e.target).removeClass("x onX").val("")),this.filter("")},showHideFilter:function(){if(!this.$el.is(":visible"))return;var e=this.$(".roster-filter"),t=this.$(".filter-type"),n=e.is(":visible");if(n&&e.val().length>0)return;return this.$roster.hasScrollBar()?n||(e.show(),t.show()):(e.hide(),t.hide()),this},reset:function(){return m.roster.reset(),this.removeAll(),this.$roster=t('<dl class="roster-contacts" style="display: none;"></dl>'),this.render().update(),this},registerRosterHandler:function(){m.connection.addHandler(m.roster.onRosterPush.bind(m.roster),a.NS.ROSTER,"iq","set")},registerRosterXHandler:function(){var e=0;m.connection.addHandler(function(n){return window.setTimeout(function(){m.connection.flush(),m.roster.subscribeToSuggestedItems.bind(m.roster)(n)},e),e+=t(n).find("item").length*250,!0},a.NS.ROSTERX,"message",null)},registerPresenceHandler:function(){m.connection.addHandler(function(e){return m.roster.presenceHandler(e),!0}.bind(this),null,"presence",null)},onGroupAdd:function(e){var t=new m.RosterGroupView({model:e});this.add(e.get("name"),t.render()),this.positionGroup(t)},onContactAdd:function(e){this.addRosterContact(e).update(),e.get("vcard_updated")||m.getVCard(e.get("jid"))},onContactChange:function(e){this.updateChatBox(e).update(),f.has(e.changed,"subscription")&&(e.changed.subscription==="from"?this.addContactToGroup(e,J):f.contains(["both","to"],e.get("subscription"))&&this.addExistingContact(e)),f.has(e.changed,"ask")&&e.changed.ask==="subscribe"&&this.addContactToGroup(e,J),f.has(e.changed,"subscription")&&e.changed.requesting==="true"&&this.addContactToGroup(e,K),this.liveFilter()},updateChatBox:function(e){var t=m.chatboxes.get(e.get("jid")),n={};return t?(f.has(e.changed,"chat_status")&&(n.chat_status=e.get("chat_status")),f.has(e.changed,"status")&&(n.status=e.get("status")),t.save(n),this):this},positionFetchedGroups:function(e,t,n){e.sort(),e.each(function(e,t){var n=this.get(e.get("name"));n||(n=new m.RosterGroupView({model:e}),this.add(e.get("name"),n.render())),t===0?this.$roster.append(n.$el):this.appendGroup(n)}.bind(this))},positionGroup:function(e){var n=this.$roster.find(".roster-group"),r=n.length?this.model.indexOf(e.model):0;return r===0?this.$roster.prepend(e.$el):r===this.model.length-1?this.appendGroup(e):t(n.eq(r)).before(e.$el),this},appendGroup:function(e){var t=this.$roster.find(".roster-group").last(),n=t.siblings("dd");return n.length>0?n.last().after(e.$el):t.after(e.$el),this},getGroup:function(e){var t=this.get(e);return t?t.model:this.model.create({name:e,id:h(e)})},addContactToGroup:function(e,t){this.getGroup(t).contacts.add(e)},addExistingContact:function(e){var t;m.roster_groups?(t=e.get("groups"),t.length===0&&(t=[Q])):t=[V],f.each(t,f.bind(this.addContactToGroup,this,e))},addRosterContact:function(e){return e.get("subscription")==="both"||e.get("subscription")==="to"?this.addExistingContact(e):e.get("ask")==="subscribe"||e.get("subscription")==="from"?this.addContactToGroup(e,J):e.get("requesting")===!0&&this.addContactToGroup(e,K),this}}),this.XMPPStatus=Backbone.Model.extend({initialize:function(){this.set({status:this.getStatus()}),this.on("change",function(e){this.get("fullname")===undefined&&m.getVCard(null,function(e,t,n,r,i,s){this.save({fullname:n})}.bind(this)),f.has(e.changed,"status")&&m.emit("statusChanged",this.get("status")),f.has(e.changed,"status_message")&&m.emit("statusMessageChanged",this.get("status_message"))}.bind(this))},constructPresence:function(e,t){typeof e=="undefined"&&(e=this.get("status")||"online"),typeof t=="undefined"&&(t=this.get("status_message"));var n;return e==="unavailable"||e==="probe"||e==="error"||e==="unsubscribe"||e==="unsubscribed"||e==="subscribe"||e==="subscribed"?n=i({type:e}):e==="offline"?(n=i({type:"unavailable"}),t&&n.c("show").t(e)):(e==="online"?n=i():n=i().c("show").t(e).up(),t&&n.c("status").t(t)),n},sendPresence:function(e,t){m.connection.send(this.constructPresence(e,t))},setStatus:function(e){this.sendPresence(e),this.save({status:e})},getStatus:function(){return this.get("status")||"online"},setStatusMessage:function(e){this.sendPresence(this.getStatus(),e);var n=this.get("status_message");this.save({status_message:e}),this.xhr_custom_status&&t.ajax({url:this.xhr_custom_status_url,type:"POST",data:{msg:e}}),n===e&&this.trigger("update-status-ui",this)}}),this.XMPPStatusView=Backbone.View.extend({el:"span#xmpp-status-holder",events:{"click a.choose-xmpp-status":"toggleOptions","click #fancy-xmpp-status-select a.change-xmpp-status-message":"renderStatusChangeForm","submit #set-custom-xmpp-status":"setStatusMessage","click .dropdown dd ul li a":"setStatus"},initialize:function(){this.model.on("change:status",this.updateStatusUI,this),this.model.on("change:status_message",this.updateStatusUI,this),this.model.on("update-status-ui",this.updateStatusUI,this)},render:function(){var e=this.$el.find("select#select-xmpp-status"),n=this.model.get("status")||"offline",r=t("option",e),i,s=[];return this.$el.html(m.templates.choose_status()),this.$el.find("#fancy-xmpp-status-select").html(m.templates.chat_status({status_message:this.model.get("status_message")||q("I am %1$s",this.getPrettyStatus(n)),chat_status:n,desc_custom_status:q("Click here to write a custom status message"),desc_change_status:q("Click to change your chat status")})),r.each(function(){s.push(m.templates.status_option({value:t(this).val(),text:this.text}))}),i=this.$el.find("#target dd ul").hide(),i.append(s.join("")),e.remove(),this},toggleOptions:function(e){e.preventDefault(),t(e.target).parent().parent().siblings("dd").find("ul").toggle("fast")},renderStatusChangeForm:function(e){e.preventDefault();var t=this.model.get("status")||"offline",n=m.templates.change_status_message({status_message:t,label_custom_status:q("Custom status"),label_save:q("Save")}),r=this.$el.find(".xmpp-status");r.parent().addClass("no-border"),r.replaceWith(n),this.$el.find(".custom-xmpp-status").focus().focus()},setStatusMessage:function(e){e.preventDefault(),this.model.setStatusMessage(t(e.target).find("input").val())},setStatus:function(e){e.preventDefault();var n=t(e.target),r=n.attr("data-value");r==="logout"?(this.$el.find(".dropdown dd ul").hide(),m.logOut()):(this.model.setStatus(r),this.$el.find(".dropdown dd ul").hide())},getPrettyStatus:function(e){return e==="chat"?q("online"):e==="dnd"?q("busy"):e==="xa"?q("away for long"):e==="away"?q("away"):e==="offline"?q("offline"):q(e)||q("online")},updateStatusUI:function(e){var t=e.get("status"),n=e.get("status_message")||q("I am %1$s",this.getPrettyStatus(t));this.$el.find("#fancy-xmpp-status-select").removeClass("no-border").html(m.templates.chat_status({chat_status:t,status_message:n,desc_custom_status:q("Click here to write a custom status message"),desc_change_status:q("Click to change your chat status")}))}}),this.Session=Backbone.Model,this.Feature=Backbone.Model,this.Features=Backbone.Collection.extend({model:m.Feature,initialize:function(){this.addClientIdentities().addClientFeatures(),this.browserStorage=new Backbone.BrowserStorage[m.storage](h("converse.features"+m.bare_jid)),this.on("add",this.onFeatureAdded,this),this.browserStorage.records.length===0?(m.connection.disco.info(m.domain,null,this.onInfo.bind(this)),m.connection.disco.items(m.domain,null,this.onItems.bind(this))):this.fetch({add:!0})},onFeatureAdded:function(e){var t=e.get("preferences")||{};m.emit("serviceDiscovered",e),e.get("var")===a.NS.MAM&&t["default"]!==m.message_archiving&&m.connection.sendIQ(n({type:"get"}).c("prefs",{xmlns:a.NS.MAM}),f.bind(this.onMAMPreferences,this,e),f.bind(this.onMAMError,this,e))},onMAMPreferences:function(e,r){var i=t(r).find('prefs[xmlns="'+a.NS.MAM+'"]'),s=i.attr("default"),o;s!==m.message_archiving?(o=n({type:"set"}).c("prefs",{xmlns:a.NS.MAM,"default":m.message_archiving}),i.children().each(function(e,t){o.cnode(t).up()}),m.connection.sendIQ(o,f.bind(function(e,t){e.save({preferences:{"default":m.message_archiving}})},this,e),f.bind(this.onMAMError,this,e))):e.save({preferences:{"default":m.message_archiving}})},onMAMError:function(e){t(e).find("feature-not-implemented").length?m.log("Message Archive Management (XEP-0313) not supported by this browser"):(m.log("An error occured while trying to set archiving preferences."),m.log(e))},addClientIdentities:function(){return m.connection.disco.addIdentity("client","web","Converse.js"),this},addClientFeatures:function(){return m.connection.disco.addFeature("jabber:x:conference"),m.connection.disco.addFeature(a.NS.BOSH),m.connection.disco.addFeature(a.NS.CHATSTATES),m.connection.disco.addFeature(a.NS.DISCO_INFO),m.connection.disco.addFeature(a.NS.MAM),m.connection.disco.addFeature(a.NS.ROSTERX),m.use_vcards&&m.connection.disco.addFeature(a.NS.VCARD),m.allow_muc&&m.connection.disco.addFeature(a.NS.MUC),m.message_carbons&&m.connection.disco.addFeature(a.NS.CARBONS),this},onItems:function(e){t(e).find("query item").each(function(e,n){m.connection.disco.info(t(n).attr("jid"),null,this.onInfo.bind(this))}.bind(this))},onInfo:function(e){var n=t(e);if(n.find("identity[category=server][type=im]").length===0&&n.find("identity[category=conference][type=text]").length===0)return;n.find("feature").each(function(e,r){var i=t(r).attr("var");this[i]=!0,this.create({"var":i,from:n.attr("from")})}.bind(this))}}),this.RegisterPanel=Backbone.View.extend({tagName:"div",id:"register",className:"controlbox-pane",events:{"submit form#converse-register":"onProviderChosen"},initialize:function(e){this.reset(),this.$parent=e.$parent,this.$tabs=e.$parent.parent().find("#controlbox-tabs"),this.registerHooks()},render:function(){return this.$parent.append(this.$el.html(m.templates.register_panel({label_domain:q("Your XMPP provider's domain name:"),label_register:q("Fetch registration form"),help_providers:q("Tip: A list of public XMPP providers is available"),help_providers_link:q("here"),href_providers:m.providers_link,domain_placeholder:m.domain_placeholder}))),this.$tabs.append(m.templates.register_tab({label_register:q("Register")})),this},registerHooks:function(){var e=m.connection,t=e._connect_cb.bind(e);e._connect_cb=function(e,n,r){this._registering?this.getRegistrationFields(e,n,r)&&(this._registering=!1):t(e,n,r)}.bind(this)},getRegistrationFields:function(e,t,r){m.log("sendQueryStanza was called");var i=m.connection;i.connected=!0;var s=i._proto._reqToData(e);if(!s)return;if(i._proto._connect_cb(s)===a.Status.CONNFAIL)return!1;var o=s.getElementsByTagName("register"),u=s.getElementsByTagName("mechanism");return o.length===0&&u.length===0?(i._proto._no_auth_received(t),!1):o.length===0?(i._changeConnectStatus(a.Status.REGIFAIL,q("Sorry, the given provider does not support in band account registration. Please try with a different provider.")),!0):(i._addSysHandler(this.onRegistrationFields.bind(this),null,"iq",null,null),i.send(n({type:"get"}).c("query",{xmlns:a.NS.REGISTER}).tree()),!0)},onRegistrationFields:function(e){return e.getElementsByTagName("query").length!==1?(m.connection._changeConnectStatus(a.Status.REGIFAIL,"unknown"),!1):(this.setFields(e),this.renderRegistrationForm(e),!1)},reset:function(e){var t={fields:{},urls:[],title:"",instructions:"",registered:!1,_registering:!1,domain:null,form_type:null};f.extend(this,t),e&&f.extend(this,f.pick(e,Object.keys(t)))},onProviderChosen:function(e){e&&e.preventDefault&&e.preventDefault();var n=t(e.target),r=n.find("input[name=domain]"),i=r.val();if(!i){r.addClass("error");return}return n.find("input[type=submit]").hide().after(m.templates.registration_request({cancel:q("Cancel"),info_message:q("Requesting a registration form from the XMPP server")})),n.find("button.cancel").on("click",this.cancelRegistration.bind(this)),this.reset({domain:a.getDomainFromJid(i),_registering:!0}),m.connection.connect(this.domain,"",this.onRegistering.bind(this)),!1},giveFeedback:function(e,n){this.$(".reg-feedback").attr("class","reg-feedback").text(e),n&&t(".reg-feedback").addClass(n)},onRegistering:function(e,n){var r;m.log("onRegistering"),f.contains([a.Status.DISCONNECTED,a.Status.CONNFAIL,a.Status.REGIFAIL,a.Status.NOTACCEPTABLE,a.Status.CONFLICT],e)?(m.log("Problem during registration: Strophe.Status is: "+e),this.cancelRegistration(),n?this.giveFeedback(n,"error"):this.giveFeedback(q('Something went wrong while establishing a connection with "%1$s". Are you sure it exists?',this.domain),"error")):e===a.Status.REGISTERED&&(m.log("Registered successfully."),m.connection.reset(),r=this,this.$("form").hide(function(){t(this).replaceWith('<span class="spinner centered"/>'),r.fields.password&&r.fields.username?(m.connection.connect(r.fields.username.toLowerCase()+"@"+r.domain.toLowerCase(),r.fields.password,m.onConnectStatusChanged),m.chatboxviews.get("controlbox").switchTab({target:r.$tabs.find(".current")}).giveFeedback(q("Now logging you in"))):m.chatboxviews.get("controlbox").renderLoginPanel().giveFeedback(q("Registered successfully")),r.reset()}))},renderRegistrationForm:function(n){var r=this.$("form"),i=t(n),s,o;r.empty().append(m.templates.registration_form({domain:this.domain,title:this.title,instructions:this.instructions})),this.form_type==="xform"?(s=i.find("field"),f.each(s,function(e){r.append(c.xForm2webForm.bind(this,t(e),i))}.bind(this))):(f.each(Object.keys(this.fields),function(n){n==="username"?o=e.form_username({domain:" @"+this.domain,name:n,type:"text",label:n,value:"",required:1}):(r.append("<label>"+n+"</label>"),o=t('<input placeholder="'+n+'" name="'+n+'"></input>'),(n==="password"||n==="email")&&o.attr("type",n)),r.append(o)}.bind(this)),f.each(this.urls,function(e){r.append(t('<a target="blank"></a>').attr("href",e).text(e))}.bind(this))),this.fields?(r.append('<input type="submit" class="pure-button button-primary" value="'+q("Register")+'"/>'),r.on("submit",this.submitRegistrationForm.bind(this)),r.append('<input type="button" class="pure-button button-cancel" value="'+q("Cancel")+'"/>'),r.find("input[type=button]").on("click",this.cancelRegistration.bind(this))):(r.append('<input type="button" class="submit" value="'+q("Return")+'"/>'),r.find("input[type=button]").on("click",this.cancelRegistration.bind(this)))},reportErrors:function(e){var n=this.$("form"),r,i=t(e).find("error text"),s=n.find(".form-errors");s.length?s.empty():(r='<legend class="form-errors"></legend>',n.find("p.instructions").length?n.find("p.instructions").append(r):n.prepend(r),s=n.find(".form-errors")),i.each(function(e,n){s.append(t("<p>").text(t(n).text()))}),i.length||s.append(t("<p>").text(q("The provider rejected your registration attempt. Please check the values you entered for correctness."))),s.show()},cancelRegistration:function(e){e&&e.preventDefault&&e.preventDefault(),m.connection.reset(),this.render()},submitRegistrationForm:function(e){e&&e.preventDefault&&e.preventDefault();var r=this.$("input.required:emptyVal");if(r.length){r.addClass("error");return}var i=t(e.target).find(":input:not([type=button]):not([type=submit])"),s=n({type:"set"}).c("query",{xmlns:a.NS.REGISTER});this.form_type==="xform"?(s.c("x",{xmlns:a.NS.XFORM,type:"submit"}),i.each(function(){s.cnode(c.webForm2xForm(this)).up()})):i.each(function(){var e=t(this);s.c(e.attr("name"),{},e.val())}),m.connection._addSysHandler(this._onRegisterIQ.bind(this),null,"iq",null,null),m.connection.send(s),this.setFields(s.tree())},setFields:function(e){var n=t(e).find("query"),r;n.length>0&&(r=n.find('x[xmlns="'+a.NS.XFORM+'"]'),r.length>0?this._setFieldsFromXForm(r):this._setFieldsFromLegacy(n))},_setFieldsFromLegacy:function(e){e.children().each(function(e,n){var r=t(n);if(n.tagName.toLowerCase()==="instructions"){this.instructions=a.getText(n);return}if(n.tagName.toLowerCase()==="x"){r.attr("xmlns")==="jabber:x:oob"&&r.find("url").each(function(e,n){this.urls.push(t(n).text())}.bind(this));return}this.fields[n.tagName.toLowerCase()]=a.getText(n)}.bind(this)),this.form_type="legacy"},_setFieldsFromXForm:function(e){this.title=e.find("title").text(),this.instructions=e.find("instructions").text(),e.find("field").each(function(e,n){var r=n.getAttribute("var");r?this.fields[r.toLowerCase()]=t(n).children("value").text():m.log("WARNING: Found field we couldn't parse")}.bind(this)),this.form_type="xform"},_onRegisterIQ:function(e){var t=null,n=e.getElementsByTagName("query");n.length>0&&(n=n[0]);if(e.getAttribute("type")==="error"){m.log("Registration failed."),t=e.getElementsByTagName("error");if(t.length!==1)return m.connection._changeConnectStatus(a.Status.REGIFAIL,"unknown"),!1;t=t[0].firstChild.tagName.toLowerCase(),t==="conflict"?m.connection._changeConnectStatus(a.Status.CONFLICT,t):t==="not-acceptable"?m.connection._changeConnectStatus(a.Status.NOTACCEPTABLE,t):m.connection._changeConnectStatus(a.Status.REGIFAIL,t),this.reportErrors(e)}else m.connection._changeConnectStatus(a.Status.REGISTERED,null);return!1},remove:function(){this.$tabs.empty(),this.$el.parent().empty()}}),this.LoginPanel=Backbone.View.extend({tagName:"div",id:"login-dialog",className:"controlbox-pane",events:{"submit form#converse-login":"authenticate"},initialize:function(e){e.$parent.html(this.$el.html(m.templates.login_panel({LOGIN:E,ANONYMOUS:S,PREBIND:x,auto_login:m.auto_login,authentication:m.authentication,label_username:q("XMPP Username:"),label_password:q("Password:"),label_anon_login:q("Click here to log in anonymously"),label_login:q("Log In"),placeholder_username:q("user@server"),placeholder_password:q("password")}))),this.$tabs=e.$parent.parent().find("#controlbox-tabs")},render:function(){return this.$tabs.append(m.templates.login_tab({label_sign_in:q("Sign in")})),this.$el.find("input#jid").focus(),this.$el.is(":visible")||this.$el.show(),this},authenticate:function(e){e&&e.preventDefault&&e.preventDefault();var n=t(e.target);if(m.authentication===S){this.connect(n,m.jid,null);return}var r=n.find("input[name=jid]"),i=r.val(),s=n.find("input[name=password]"),o=s.val(),u=!1;i||(u=!0,r.addClass("error")),o||(u=!0,s.addClass("error"));if(u)return;return this.connect(n,i,o),!1},connect:function(e,t,n){var r;e&&e.find("input[type=submit]").hide().after('<span class="spinner login-submit"/>'),t&&(r=a.getResourceFromJid(t),r?t=a.getBareJidFromJid(t).toLowerCase()+"/"+a.getResourceFromJid(t):t=t.toLowerCase()+"/converse.js-"+Math.floor(Math.random()*139749825).toString()),m.connection.connect(t,n,m.onConnectStatusChanged)},remove:function(){this.$tabs.empty(),this.$el.parent().empty()}}),this.ControlBoxToggle=Backbone.View.extend({tagName:"a",className:"toggle-controlbox",id:"toggle-controlbox",events:{click:"onClick"},attributes:{href:"#"},initialize:function(){this.render()},render:function(){return t("#conversejs").prepend(this.$el.html(m.templates.controlbox_toggle({label_toggle:q("Toggle chat")}))),this.$el.hide(),this},hide:function(e){this.$el.fadeOut("fast",e)},show:function(e){this.$el.show("fast",e)},showControlBox:function(){var e=m.chatboxes.get("controlbox");e||(e=m.addControlBox()),m.connection.connected?e.save({closed:!1}):e.trigger("show")},onClick:function(e){e.preventDefault();if(t("div#controlbox").is(":visible")){var n=m.chatboxes.get("controlbox");m.connection.connected?n.save({closed:!0}):n.trigger("hide")}else this.showControlBox()}}),this.addControlBox=function(){return this.chatboxes.add({id:"controlbox",box_id:"controlbox",closed:!this.show_controlbox_by_default})},this.setUpXMLLogging=function(){this.debug&&(this.connection.xmlInput=function(e){m.log(e)},this.connection.xmlOutput=function(e){m.log(e)})},this.startNewBOSHSession=function(){t.ajax({url:this.prebind_url,type:"GET",success:function(e){this.connection.attach(e.jid,e.sid,e.rid,this.onConnectStatusChanged)}.bind(this),error:function(e){delete this.connection,this.emit("noResumeableSession")}.bind(this)})},this.attemptPreboundSession=function(e){if(!this.keepalive){if(this.jid&&this.sid&&this.rid)return this.connection.attach(this.jid,this.sid,this.rid,this.onConnectStatusChanged);throw new Error("initConnection: If you use prebind and not keepalive, then you MUST supply JID, RID and SID values")}if(!this.jid)throw new Error("initConnection: when using 'keepalive' with 'prebind, you must supply the JID of the current user.");try{return this.connection.restore(this.jid,this.onConnectStatusChanged)}catch(t){m.log("Could not restore session for jid: "+this.jid+" Error message: "+t.message)}this.prebind_url?this.startNewBOSHSession():(delete this.connection,this.emit("noResumeableSession"))},this.attemptNonPreboundSession=function(){if(this.keepalive)try{return this.connection.restore(undefined,this.onConnectStatusChanged)}catch(e){m.log("Could not restore sessions. Error message: "+e.message)}if(this.auto_login){if(!this.jid)throw new Error("initConnection: If you use auto_login, you also need to provide a jid value");if(this.authentication===S)this.connection.connect(this.jid.toLowerCase(),null,this.onConnectStatusChanged);else if(this.authentication===E){if(!this.password)throw new Error("initConnection: If you use auto_login and authentication='login' then you also need to provide a password.");this.jid=a.getBareJidFromJid(this.jid).toLowerCase()+"/"+a.getResourceFromJid(this.jid),this.connection.connect(this.jid,this.password,this.onConnectStatusChanged)}}},this.initConnection=function(){if(this.connection&&this.connection.connected)this.setUpXMLLogging(),this.onConnected();else{if(!this.bosh_service_url&&!this.websocket_url)throw new Error("initConnection: you must supply a value for either the bosh_service_url or websocket_url or both.");if(("WebSocket"in window||"MozWebSocket"in window)&&this.websocket_url)this.connection=new a.Connection(this.websocket_url);else{if(!this.bosh_service_url)throw new Error("initConnection: this browser does not support websockets and bosh_service_url wasn't specified.");this.connection=new a.Connection(this.bosh_service_url,{keepalive:this.keepalive})}this.setUpXMLLogging(),this.authentication===x?this.attemptPreboundSession():this.attemptNonPreboundSession()}},this._tearDown=function(){return this.initial_presence_sent=!1,this.roster&&this.roster.off().reset(),this.rosterview&&(this.rosterview.unregisterHandlers(),this.rosterview.model.off().reset(),this.rosterview.undelegateEvents().remove()),this.chatboxes.remove(),this.features&&this.features.reset(),this.minimized_chats&&(this.minimized_chats.undelegateEvents().model.reset(),this.minimized_chats.removeAll(),this.minimized_chats.tearDown().remove(),delete this.minimized_chats),this},this._initialize=function(){return this.chatboxes=new this.ChatBoxes,this.chatboxviews=new this.ChatBoxViews({model:this.chatboxes}),this.controlboxtoggle=new this.ControlBoxToggle,this.otr=new this.OTR,this.initSession(),this.initConnection(),this.connection&&this.addControlBox(),this},this._overrideAttribute=function(e,t){var n=t.overrides[e];typeof n=="function"?(typeof t._super=="undefined"&&(t._super={converse:m}),t._super[e]=m[e].bind(m),m[e]=n.bind(t)):m[e]=n},this._extendObject=function(e,t){e.prototype._super||(e.prototype._super={converse:m}),f.each(t,function(t,n){n==="events"?e.prototype[n]=f.extend(t,e.prototype[n]):(typeof t=="function"&&(e.prototype._super[n]=e.prototype[n]),e.prototype[n]=t)})},this._initializePlugins=function(){f.each(this.plugins,function(e){e.converse=m,f.each(Object.keys(e.overrides),function(t){var n=e.overrides[t];typeof n=="object"?this._extendObject(m[t],n):this._overrideAttribute(t,e)}.bind(this)),typeof e.initialize=="function"?e.initialize.bind(e)(this):e.bind(this)(this)}.bind(this))},d.connection&&(this.connection=d.connection),this._initializePlugins(),this._initialize(),this.registerGlobalEventHandlers(),m.emit("initialized")};var y=function(e){if(!e)return;var t=d.chatboxviews.get(e.get("jid"));return{close:t.close.bind(t),endOTR:e.endOTR.bind(e),focus:t.focus.bind(t),get:e.get.bind(e),initiateOTR:e.initiateOTR.bind(e),is_chatroom:e.is_chatroom,maximize:e.maximize.bind(e),minimize:e.minimize.bind(e),open:t.show.bind(t),set:e.set.bind(e)}},b={initialize:function(e,t){d.initialize(e,t)},disconnect:function(){d.connection.disconnect()},account:{logout:function(){d.logOut()}},user:{logout:function(){d.logOut()},status:{get:function(){return d.xmppstatus.get("status")},set:function(e,t){var n={status:e};if(!f.contains(f.keys(g),e))throw new Error("Invalid availability value. See https://xmpp.org/rfcs/rfc3921.html#rfc.section.2.2.2.1");typeof t=="string"&&(n.status_message=t),d.xmppstatus.save(n)},message:{get:function(){return d.xmppstatus.get("status_message")},set:function(e){d.xmppstatus.save({status_message:e})}}}},settings:{get:function(e){if(f.contains(Object.keys(d.default_settings),e))return d[e]},set:function(e,t){var n={};typeof e=="object"?f.extend(d,f.pick(e,Object.keys(d.default_settings))):typeof e=="string"&&(n[e]=t,f.extend(d,f.pick(n,Object.keys(d.default_settings))))}},contacts:{get:function(e){var t=function(e){var t=d.roster.get(a.getBareJidFromJid(e));return t?t.attributes:null};if(typeof e=="undefined")e=d.roster.pluck("jid");else if(typeof e=="string")return t(e);return f.map(e,t)},add:function(e,t){if(typeof e!="string"||e.indexOf("@")<0)throw new TypeError("contacts.add: invalid jid");d.roster.addAndSubscribe(e,f.isEmpty(t)?e:t)}},chats:{open:function(e){var t;return typeof e=="undefined"?(d.log("chats.open: You need to provide at least one JID","error"),null):typeof e=="string"?(t=y(d.chatboxes.getChatBox(e,!0)),t.open(),t):f.map(e,function(e){return t=y(d.chatboxes.getChatBox(e,!0)),t.open(),t})},get:function(e){return typeof e=="undefined"?(d.log("chats.get: You need to provide at least one JID","error"),null):typeof e=="string"?y(d.chatboxes.getChatBox(e,!0)):f.map(e,f.partial(f.compose(y,d.chatboxes.getChatBox.bind(d.chatboxes)),f,!0))}},archive:{query:function(e,r,i){var s,o=[];typeof e=="function"&&(r=e,i=r);if(!d.features.findWhere({"var":a.NS.MAM}))throw new Error("This server does not support XEP-0313, Message Archive Management");var u=d.connection.getUniqueId(),c={type:"set"};if(typeof e!="undefined"&&e.groupchat){if(!e["with"])throw new Error('You need to specify a "with" value containing the chat room JID, when querying groupchat messages.');c.to=e["with"]}var h=n(c).c("query",{xmlns:a.NS.MAM,queryid:u});typeof e!="undefined"&&(h.c("x",{xmlns:a.NS.XFORM,type:"submit"}).c("field",{"var":"FORM_TYPE",type:"hidden"}).c("value").t(a.NS.MAM).up().up(),e["with"]&&!e.groupchat&&h.c("field",{"var":"with"}).c("value").t(e["with"]).up().up(),f.each(["start","end"],function(t){if(e[t]){s=l(e[t]);if(!s.isValid())throw new TypeError("archive.query: invalid date provided for: "+t);h.c("field",{"var":t}).c("value").t(s.format()).up().up()}}),h.up(),e instanceof a.RSM?h.cnode(e.toXML()):f.intersection(v,f.keys(e)).length&&h.cnode((new a.RSM(e)).toXML())),d.connection.addHandler(function(n){var i=t(n),s,l;if(typeof r=="function")return s=i.find('fin[xmlns="'+a.NS.MAM+'"]'),s.length?(l=new a.RSM({xml:s.find("set")[0]}),f.extend(l,f.pick(e,["max"])),f.extend(l,f.pick(e,m)),r(o,l),!1):(u===i.find("result").attr("queryid")&&o.push(n),!0);return!1},a.NS.MAM),d.connection.sendIQ(h,null,i)}},rooms:{open:function(e,t){t||(t=a.getNodeFromJid(d.bare_jid));if(typeof t!="string")throw new TypeError("rooms.open: invalid nick, must be string");var n=function(e){var n=d.chatboxes.get(e);return d.log("jid"),n||(n=d.chatboxviews.showChat({id:e,jid:e,name:a.unescapeNode(a.getNodeFromJid(e)),nick:t,chatroom:!0,box_id:h(e)})),y(d.chatboxes.getChatBox(e,!0))};if(typeof e=="undefined")throw new TypeError("rooms.open: You need to provide at least one JID");return typeof e=="string"?n(e):f.map(e,n)},get:function(e){if(typeof e=="undefined")throw new TypeError("rooms.get: You need to provide at least one JID");return typeof e=="string"?y(d.chatboxes.getChatBox(e,!0)):f.map(e,f.partial(y,f.bind(d.chatboxes.getChatBox,d.chatboxes,f,!0)))}},tokens:{get:function(e){if(!d.expose_rid_and_sid||typeof d.connection=="undefined")return null;if(e.toLowerCase()==="rid")return d.connection.rid||d.connection._proto.rid;if(e.toLowerCase()==="sid")return d.connection.sid||d.connection._proto.sid}},listen:{once:function(e,t){d.once(e,t)},on:function(e,t){d.on(e,t)},not:function(e,t){d.off(e,t)}},send:function(e){d.connection.send(e)},ping:function(e){d.ping(e)},plugins:{add:function(e,t){d.plugins[e]=t},remove:function(e){delete d.plugins[e]},override:function(e,t){d._overrideAttribute(e,t)},extend:function(e,t){d._extendObject(e,t)}},env:{$build:s,$iq:n,$msg:r,$pres:i,Strophe:a,_:f,b64_sha1:h,jQuery:t,moment:l}};return b});var config;typeof require=="undefined"&&(require={config:function(e){config=e}}),require.config({baseUrl:".",paths:{backbone:"components/backbone/backbone","backbone.browserStorage":"components/backbone.browserStorage/backbone.browserStorage","backbone.overview":"components/backbone.overview/backbone.overview","converse-dependencies":"src/deps-full","converse-templates":"src/templates",eventemitter:"components/otr/build/dep/eventemitter",jquery:"components/jquery/dist/jquery","jquery-private":"src/jquery-private","jquery.browser":"components/jquery.browser/dist/jquery.browser","jquery.easing":"components/jquery-easing-original/index",moment:"components/momentjs/moment",strophe:"components/strophejs/src/wrapper","strophe-base64":"components/strophejs/src/base64","strophe-bosh":"components/strophejs/src/bosh","strophe-core":"components/strophejs/src/core","strophe-md5":"components/strophejs/src/md5","strophe-polyfill":"components/strophejs/src/polyfills","strophe-sha1":"components/strophejs/src/sha1","strophe-websocket":"components/strophejs/src/websocket","strophe.disco":"components/strophejs-plugins/disco/strophe.disco","strophe.ping":"src/strophe.ping","strophe.rsm":"components/strophejs-plugins/rsm/strophe.rsm","strophe.vcard":"src/strophe.vcard",text:"components/requirejs-text/text",tpl:"components/requirejs-tpl-jcbrand/tpl",typeahead:"components/typeahead.js/index",underscore:"components/underscore/underscore",utils:"src/utils",polyfill:"src/polyfill",bigint:"src/bigint",crypto:"src/crypto","crypto.aes":"components/otr/vendor/cryptojs/aes","crypto.cipher-core":"components/otr/vendor/cryptojs/cipher-core","crypto.core":"components/otr/vendor/cryptojs/core","crypto.enc-base64":"components/otr/vendor/cryptojs/enc-base64","crypto.evpkdf":"components/crypto-js-evanvosberg/src/evpkdf","crypto.hmac":"components/otr/vendor/cryptojs/hmac","crypto.md5":"components/crypto-js-evanvosberg/src/md5","crypto.mode-ctr":"components/otr/vendor/cryptojs/mode-ctr","crypto.pad-nopadding":"components/otr/vendor/cryptojs/pad-nopadding","crypto.sha1":"components/otr/vendor/cryptojs/sha1","crypto.sha256":"components/otr/vendor/cryptojs/sha256",salsa20:"components/otr/build/dep/salsa20",otr:"src/otr",locales:"src/locales",jed:"components/jed/jed",af:"locale/af/LC_MESSAGES/converse.json",de:"locale/de/LC_MESSAGES/converse.json",en:"locale/en/LC_MESSAGES/converse.json",es:"locale/es/LC_MESSAGES/converse.json",fr:"locale/fr/LC_MESSAGES/converse.json",he:"locale/he/LC_MESSAGES/converse.json",hu:"locale/hu/LC_MESSAGES/converse.json",id:"locale/id/LC_MESSAGES/converse.json",it:"locale/it/LC_MESSAGES/converse.json",ja:"locale/ja/LC_MESSAGES/converse.json",nb:"locale/nb/LC_MESSAGES/converse.json",nl:"locale/nl/LC_MESSAGES/converse.json",pl:"locale/pl/LC_MESSAGES/converse.json",pt_BR:"locale/pt_BR/LC_MESSAGES/converse.json",ru:"locale/ru/LC_MESSAGES/converse.json",uk:"locale/uk/LC_MESSAGES/converse.json",zh:"locale/zh/LC_MESSAGES/converse.json",moment_with_locales:"src/moment_locales",moment_af:"components/momentjs/locale/af",moment_de:"components/momentjs/locale/de",moment_es:"components/momentjs/locale/es",moment_fr:"components/momentjs/locale/fr",moment_he:"components/momentjs/locale/he",moment_hu:"components/momentjs/locale/hu",moment_id:"components/momentjs/locale/id",moment_it:"components/momentjs/locale/it",moment_ja:"components/momentjs/locale/ja",moment_nb:"components/momentjs/locale/nb",moment_nl:"components/momentjs/locale/nl",moment_pl:"components/momentjs/locale/pl","moment_pt-br":"components/momentjs/locale/pt-br",moment_ru:"components/momentjs/locale/ru",moment_uk:"components/momentjs/locale/uk",moment_zh:"components/momentjs/locale/zh-cn",action:"src/templates/action",add_contact_dropdown:"src/templates/add_contact_dropdown",add_contact_form:"src/templates/add_contact_form",change_status_message:"src/templates/change_status_message",chat_status:"src/templates/chat_status",chatarea:"src/templates/chatarea",chatbox:"src/templates/chatbox",chatroom:"src/templates/chatroom",chatroom_form:"src/templates/chatroom_form",chatroom_password_form:"src/templates/chatroom_password_form",chatroom_sidebar:"src/templates/chatroom_sidebar",chatrooms_tab:"src/templates/chatrooms_tab",chats_panel:"src/templates/chats_panel",choose_status:"src/templates/choose_status",contacts_panel:"src/templates/contacts_panel",contacts_tab:"src/templates/contacts_tab",controlbox:"src/templates/controlbox",controlbox_toggle:"src/templates/controlbox_toggle",field:"src/templates/field",form_captcha:"src/templates/form_captcha",form_checkbox:"src/templates/form_checkbox",form_input:"src/templates/form_input",form_select:"src/templates/form_select",form_textarea:"src/templates/form_textarea",form_username:"src/templates/form_username",group_header:"src/templates/group_header",info:"src/templates/info",login_panel:"src/templates/login_panel",login_tab:"src/templates/login_tab",message:"src/templates/message",new_day:"src/templates/new_day",occupant:"src/templates/occupant",pending_contact:"src/templates/pending_contact",pending_contacts:"src/templates/pending_contacts",register_panel:"src/templates/register_panel",register_tab:"src/templates/register_tab",registration_form:"src/templates/registration_form",registration_request:"src/templates/registration_request",requesting_contact:"src/templates/requesting_contact",requesting_contacts:"src/templates/requesting_contacts",room_description:"src/templates/room_description",room_item:"src/templates/room_item",room_panel:"src/templates/room_panel",roster:"src/templates/roster",roster_item:"src/templates/roster_item",search_contact:"src/templates/search_contact",select_option:"src/templates/select_option",status_option:"src/templates/status_option",toggle_chats:"src/templates/toggle_chats",toolbar:"src/templates/toolbar",trimmed_chat:"src/templates/trimmed_chat",vcard:"src/templates/vcard"},map:{"*":{jquery:"jquery-private"},"jquery-private":{jquery:"jquery"}},tpl:{templateSettings:{evaluate:/\{\[([\s\S]+?)\]\}/g,interpolate:/\{\{([\s\S]+?)\}\}/g}},shim:{"crypto.aes":{deps:["crypto.cipher-core"]},"crypto.cipher-core":{deps:["crypto.enc-base64","crypto.evpkdf"]},"crypto.enc-base64":{deps:["crypto.core"]},"crypto.evpkdf":{deps:["crypto.md5"]},"crypto.hmac":{deps:["crypto.core"]},"crypto.md5":{deps:["crypto.core"]},"crypto.mode-ctr":{deps:["crypto.cipher-core"]},"crypto.pad-nopadding":{deps:["crypto.cipher-core"]},"crypto.sha1":{deps:["crypto.core"]},"crypto.sha256":{deps:["crypto.core"]},bigint:{deps:["crypto"]},"strophe.ping":{deps:["strophe"]},"strophe.register":{deps:["strophe"]},"strophe.vcard":{deps:["strophe"]}}}),typeof require=="function"&&require(["converse"],function(e){window.converse=e}),define("main",function(){});
\ No newline at end of file
diff --git a/xmpp/lang/it/messages.po b/xmpp/lang/it/messages.po
new file mode 100644 (file)
index 0000000..5b5a628
--- /dev/null
@@ -0,0 +1,61 @@
+# ADDON xmpp
+# Copyright (C)
+# This file is distributed under the same license as the Friendica xmpp addon package.
+# 
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-27 09:30+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: fabrixxm <fabrix.xm@gmail.com>, 2018\n"
+"Language-Team: Italian (https://www.transifex.com/Friendica/teams/12172/it/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: it\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: xmpp.php:38
+msgid "XMPP settings updated."
+msgstr "Impostazioni XMPP aggiornate."
+
+#: xmpp.php:63 xmpp.php:67
+msgid "XMPP-Chat (Jabber)"
+msgstr "XMPP-Chat (Jabber)"
+
+#: xmpp.php:71
+msgid "Enable Webchat"
+msgstr "Abilita chat web"
+
+#: xmpp.php:76
+msgid "Individual Credentials"
+msgstr "Credenziali Individuali"
+
+#: xmpp.php:82 xmpp.php:108
+msgid "Jabber BOSH host"
+msgstr "Server Jabber BOSH"
+
+#: xmpp.php:91 xmpp.php:107
+msgid "Save Settings"
+msgstr "Salva Impostazioni"
+
+#: xmpp.php:109
+msgid "Use central userbase"
+msgstr "Usa base utenti centrale"
+
+#: xmpp.php:109
+msgid ""
+"If enabled, users will automatically login to an ejabberd server that has to"
+" be installed on this machine with synchronized credentials via the "
+"\"auth_ejabberd.php\" script."
+msgstr ""
+"Se abilitato, gli utenti verranno automaticamente autenticati con un server "
+"ejabber che deve essere installato su questa macchina, con le credenziali "
+"sincronizzate attraverso lo script \"auth_ejabberd.php\""
+
+#: xmpp.php:119
+msgid "Settings updated."
+msgstr "Impostazioni aggiornate."
diff --git a/xmpp/lang/it/strings.php b/xmpp/lang/it/strings.php
new file mode 100644 (file)
index 0000000..d0bebb7
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+if(! function_exists("string_plural_select_it")) {
+function string_plural_select_it($n){
+       return ($n != 1);;
+}}
+;
+$a->strings["XMPP settings updated."] = "Impostazioni XMPP aggiornate.";
+$a->strings["XMPP-Chat (Jabber)"] = "XMPP-Chat (Jabber)";
+$a->strings["Enable Webchat"] = "Abilita chat web";
+$a->strings["Individual Credentials"] = "Credenziali Individuali";
+$a->strings["Jabber BOSH host"] = "Server Jabber BOSH";
+$a->strings["Save Settings"] = "Salva Impostazioni";
+$a->strings["Use central userbase"] = "Usa base utenti centrale";
+$a->strings["If enabled, users will automatically login to an ejabberd server that has to be installed on this machine with synchronized credentials via the \"auth_ejabberd.php\" script."] = "Se abilitato, gli utenti verranno automaticamente autenticati con un server ejabber che deve essere installato su questa macchina, con le credenziali sincronizzate attraverso lo script \"auth_ejabberd.php\"";
+$a->strings["Settings updated."] = "Impostazioni aggiornate.";
diff --git a/xmpp/lang/nl/messages.po b/xmpp/lang/nl/messages.po
new file mode 100644 (file)
index 0000000..dabd449
--- /dev/null
@@ -0,0 +1,61 @@
+# ADDON xmpp
+# Copyright (C)
+# This file is distributed under the same license as the Friendica xmpp addon package.
+# 
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-11-27 09:30+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Karel Vandecandelaere <karel@dasrakel.eu>, 2018\n"
+"Language-Team: Dutch (https://www.transifex.com/Friendica/teams/12172/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: xmpp.php:38
+msgid "XMPP settings updated."
+msgstr "XMPP-instellingen bijgewerkt."
+
+#: xmpp.php:63 xmpp.php:67
+msgid "XMPP-Chat (Jabber)"
+msgstr "XMPP-chat (Jabber)"
+
+#: xmpp.php:71
+msgid "Enable Webchat"
+msgstr "Webchat inschakelen"
+
+#: xmpp.php:76
+msgid "Individual Credentials"
+msgstr ""
+
+#: xmpp.php:82 xmpp.php:108
+msgid "Jabber BOSH host"
+msgstr "Jabber BOSH Server"
+
+#: xmpp.php:91 xmpp.php:107
+msgid "Save Settings"
+msgstr "Instellingen opslaan"
+
+#: xmpp.php:109
+msgid "Use central userbase"
+msgstr ""
+
+#: xmpp.php:109
+msgid ""
+"If enabled, users will automatically login to an ejabberd server that has to"
+" be installed on this machine with synchronized credentials via the "
+"\"auth_ejabberd.php\" script."
+msgstr ""
+"Wanneer ingeschakeld zullen gebruikers automatisch inloggen op een ejabberd-"
+"server die op deze server moet geïnstalleerd staan, met dezelfde "
+"gebruikersnaam en wachtwoord, via het \"auth_ejabberd.php\" script."
+
+#: xmpp.php:119
+msgid "Settings updated."
+msgstr "Instellingen bijgewerkt."
diff --git a/xmpp/lang/nl/strings.php b/xmpp/lang/nl/strings.php
new file mode 100644 (file)
index 0000000..aba5867
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+if(! function_exists("string_plural_select_nl")) {
+function string_plural_select_nl($n){
+       return ($n != 1);;
+}}
+;
+$a->strings["XMPP settings updated."] = "XMPP-instellingen bijgewerkt.";
+$a->strings["XMPP-Chat (Jabber)"] = "XMPP-chat (Jabber)";
+$a->strings["Enable Webchat"] = "Webchat inschakelen";
+$a->strings["Individual Credentials"] = "";
+$a->strings["Jabber BOSH host"] = "Jabber BOSH Server";
+$a->strings["Save Settings"] = "Instellingen opslaan";
+$a->strings["Use central userbase"] = "";
+$a->strings["If enabled, users will automatically login to an ejabberd server that has to be installed on this machine with synchronized credentials via the \"auth_ejabberd.php\" script."] = "Wanneer ingeschakeld zullen gebruikers automatisch inloggen op een ejabberd-server die op deze server moet geïnstalleerd staan, met dezelfde gebruikersnaam en wachtwoord, via het \"auth_ejabberd.php\" script.";
+$a->strings["Settings updated."] = "Instellingen bijgewerkt.";
index 076b7b130f7852a27c15ef70ea4ea52e58186dba..422c6277de9117d91ecf295bf7b7f3bec2543432 100644 (file)
@@ -5,34 +5,42 @@
  * Version: 0.1
  * Author: Michael Vogel <https://pirati.ca/profile/heluecht>
  */
-
-function xmpp_install() {
-       register_hook('plugin_settings', 'addon/xmpp/xmpp.php', 'xmpp_plugin_settings');
-       register_hook('plugin_settings_post', 'addon/xmpp/xmpp.php', 'xmpp_plugin_settings_post');
-       register_hook('page_end', 'addon/xmpp/xmpp.php', 'xmpp_script');
-       register_hook('logged_in', 'addon/xmpp/xmpp.php', 'xmpp_login');
+use Friendica\App;
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
+use Friendica\Core\PConfig;
+
+function xmpp_install()
+{
+       Addon::registerHook('addon_settings', 'addon/xmpp/xmpp.php', 'xmpp_addon_settings');
+       Addon::registerHook('addon_settings_post', 'addon/xmpp/xmpp.php', 'xmpp_addon_settings_post');
+       Addon::registerHook('page_end', 'addon/xmpp/xmpp.php', 'xmpp_script');
+       Addon::registerHook('logged_in', 'addon/xmpp/xmpp.php', 'xmpp_login');
 }
 
-function xmpp_uninstall() {
-       unregister_hook('plugin_settings', 'addon/xmpp/xmpp.php', 'xmpp_plugin_settings');
-       unregister_hook('plugin_settings_post', 'addon/xmpp/xmpp.php', 'xmpp_plugin_settings_post');
-       unregister_hook('page_end', 'addon/xmpp/xmpp.php', 'xmpp_script');
-       unregister_hook('logged_in', 'addon/xmpp/xmpp.php', 'xmpp_login');
+function xmpp_uninstall()
+{
+       Addon::unregisterHook('addon_settings', 'addon/xmpp/xmpp.php', 'xmpp_addon_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/xmpp/xmpp.php', 'xmpp_addon_settings_post');
+       Addon::unregisterHook('page_end', 'addon/xmpp/xmpp.php', 'xmpp_script');
+       Addon::unregisterHook('logged_in', 'addon/xmpp/xmpp.php', 'xmpp_login');
 }
 
-function xmpp_plugin_settings_post($a,$post) {
-       if(! local_user() || (! x($_POST,'xmpp-settings-submit')))
+function xmpp_addon_settings_post()
+{
+       if (!local_user() || (!x($_POST, 'xmpp-settings-submit'))) {
                return;
        set_pconfig(local_user(),'xmpp','enabled',intval($_POST['xmpp_enabled']));
        set_pconfig(local_user(),'xmpp','individual',intval($_POST['xmpp_individual']));
        set_pconfig(local_user(),'xmpp','bosh_proxy',$_POST['xmpp_bosh_proxy']);
 
-       info( t('XMPP settings updated.') . EOL);
+       info(L10n::t('XMPP settings updated.') . EOL);
 }
 
-function xmpp_plugin_settings(&$a,&$s) {
-
-       if(! local_user())
+function xmpp_addon_settings(App $a, &$s)
+{
+       if (!local_user()) {
                return;
 
        /* Add our stylesheet to the xmpp so we can make our settings look nice */
@@ -51,27 +59,27 @@ function xmpp_plugin_settings(&$a,&$s) {
 
        /* Add some HTML to the existing form */
        $s .= '<span id="settings_xmpp_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_xmpp_expanded\'); openClose(\'settings_xmpp_inflated\');">';
-       $s .= '<h3>' . t('XMPP-Chat (Jabber)') . '</h3>';
+       $s .= '<h3>' . L10n::t('XMPP-Chat (Jabber)') . '</h3>';
        $s .= '</span>';
        $s .= '<div id="settings_xmpp_expanded" class="settings-block" style="display: none;">';
        $s .= '<span class="fakelink" onclick="openClose(\'settings_xmpp_expanded\'); openClose(\'settings_xmpp_inflated\');">';
-       $s .= '<h3>' . t('XMPP-Chat (Jabber)') . '</h3>';
+       $s .= '<h3>' . L10n::t('XMPP-Chat (Jabber)') . '</h3>';
        $s .= '</span>';
 
        $s .= '<div id="xmpp-settings-wrapper">';
-       $s .= '<label id="xmpp-enabled-label" for="xmpp-enabled">' . t('Enable Webchat') . '</label>';
+       $s .= '<label id="xmpp-enabled-label" for="xmpp-enabled">' . L10n::t('Enable Webchat') . '</label>';
        $s .= '<input id="xmpp-enabled" type="checkbox" name="xmpp_enabled" value="1" ' . $enabled_checked . '/>';
        $s .= '<div class="clear"></div>';
 
-       if (get_config("xmpp", "central_userbase")) {
-               $s .= '<label id="xmpp-individual-label" for="xmpp-individual">' . t('Individual Credentials') . '</label>';
+       if (Config::get("xmpp", "central_userbase")) {
+               $s .= '<label id="xmpp-individual-label" for="xmpp-individual">' . L10n::t('Individual Credentials') . '</label>';
                $s .= '<input id="xmpp-individual" type="checkbox" name="xmpp_individual" value="1" ' . $individual_checked . '/>';
                $s .= '<div class="clear"></div>';
        }
 
-       if (!get_config("xmpp", "central_userbase") || get_pconfig(local_user(),"xmpp","individual")) {
-               $s .= '<label id="xmpp-bosh-proxy-label" for="xmpp-bosh-proxy">'.t('Jabber BOSH host').'</label>';
-               $s .= ' <input id="xmpp-bosh-proxy" type="text" name="xmpp_bosh_proxy" value="'.$bosh_proxy.'" />';
+       if (!Config::get("xmpp", "central_userbase") || PConfig::get(local_user(), "xmpp", "individual")) {
+               $s .= '<label id="xmpp-bosh-proxy-label" for="xmpp-bosh-proxy">' . L10n::t('Jabber BOSH host') . '</label>';
+               $s .= ' <input id="xmpp-bosh-proxy" type="text" name="xmpp_bosh_proxy" value="' . $bosh_proxy . '" />';
                $s .= '<div class="clear"></div>';
        }
 
@@ -79,8 +87,7 @@ function xmpp_plugin_settings(&$a,&$s) {
 
        /* provide a submit button */
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="xmpp-settings-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
-
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="xmpp-settings-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 }
 
 function xmpp_login($a,$b) {
@@ -90,22 +97,24 @@ function xmpp_login($a,$b) {
        }
 }
 
-function xmpp_plugin_admin(&$a, &$o){
+function xmpp_addon_admin(App $a, &$o)
+{
        $t = get_markup_template("admin.tpl", "addon/xmpp/");
 
-       $o = replace_macros($t, array(
-               '$submit' => t('Save Settings'),
-               '$bosh_proxy'       => array('bosh_proxy', t('Jabber BOSH host'),            get_config('xmpp', 'bosh_proxy'), ''),
-               '$central_userbase' => array('central_userbase', t('Use central userbase'), get_config('xmpp', 'central_userbase'), t('If enabled, users will automatically login to an ejabberd server that has to be installed on this machine with synchronized credentials via the "auth_ejabberd.php" script.')),
-       ));
+       $o = replace_macros($t, [
+               '$submit' => L10n::t('Save Settings'),
+               '$bosh_proxy' => ['bosh_proxy', L10n::t('Jabber BOSH host'), Config::get('xmpp', 'bosh_proxy'), ''],
+               '$central_userbase' => ['central_userbase', L10n::t('Use central userbase'), Config::get('xmpp', 'central_userbase'), L10n::t('If enabled, users will automatically login to an ejabberd server that has to be installed on this machine with synchronized credentials via the "auth_ejabberd.php" script.')],
+       ]);
 }
 
-function xmpp_plugin_admin_post(&$a){
-       $bosh_proxy       = ((x($_POST,'bosh_proxy')) ?       trim($_POST['bosh_proxy']) : '');
-       $central_userbase = ((x($_POST,'central_userbase')) ? intval($_POST['central_userbase']) : false);
-       set_config('xmpp','bosh_proxy',$bosh_proxy);
-       set_config('xmpp','central_userbase',$central_userbase);
-       info( t('Settings updated.'). EOL );
+function xmpp_addon_admin_post()
+{
+       $bosh_proxy = ((x($_POST, 'bosh_proxy')) ? trim($_POST['bosh_proxy']) : '');
+       $central_userbase = ((x($_POST, 'central_userbase')) ? intval($_POST['central_userbase']) : false);
+       Config::set('xmpp', 'bosh_proxy', $bosh_proxy);
+       Config::set('xmpp', 'central_userbase', $central_userbase);
+       info(L10n::t('Settings updated.') . EOL);
 }
 
 function xmpp_script(&$a,&$s) {
index 3950f0279e9d1dfac6c1c77d6b5c5f3b970f79af..e9b8227dba583f317e3ed4bafddfcf0f7652b458 100644 (file)
@@ -1,8 +1,8 @@
 YourLS
 
 For server admins only.
-Defines a YourLS url shortener for the Statusnet & Twitter plugins.
+Defines a YourLS url shortener for the Statusnet & Twitter addons.
 
-This plugin will not do anything else unless the Statusnet and/or Twitter plugins are installed.
+This addon will not do anything else unless the Statusnet and/or Twitter addons are installed.
 
-The message is entered in the admin account at Settings -> Plugin settings.
+The message is entered in the admin account at Settings -> Addon settings.
index d11f279757a681d88d6109ae1c3134230d78724a..033ffd045d60bbc14e934b90afb7141102861d7f 100644 (file)
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-02-27 05:01-0500\n"
-"PO-Revision-Date: 2015-08-31 10:30+0000\n"
+"PO-Revision-Date: 2017-09-20 06:09+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.com/Friendica/friendica/language/it/)\n"
 "MIME-Version: 1.0\n"
diff --git a/yourls/lang/nl/messages.po b/yourls/lang/nl/messages.po
new file mode 100644 (file)
index 0000000..ab06d2d
--- /dev/null
@@ -0,0 +1,48 @@
+# ADDON yourls
+# Copyright (C)
+# This file is distributed under the same license as the Friendica yourls addon package.
+# 
+# 
+# Translators:
+# Karel Vandecandelaere <karel@dasrakel.eu>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: friendica\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-02-27 05:01-0500\n"
+"PO-Revision-Date: 2018-03-20 13:29+0000\n"
+"Last-Translator: Karel Vandecandelaere <karel@dasrakel.eu>\n"
+"Language-Team: Dutch (http://www.transifex.com/Friendica/friendica/language/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: yourls.php:55
+msgid "YourLS Settings"
+msgstr "YourLS-instellingen"
+
+#: yourls.php:57
+msgid "URL: http://"
+msgstr "URL: http://"
+
+#: yourls.php:62
+msgid "Username:"
+msgstr "Gebruikersnaam:"
+
+#: yourls.php:67
+msgid "Password:"
+msgstr "Wachtwoord:"
+
+#: yourls.php:72
+msgid "Use SSL "
+msgstr "Gebruik SSL"
+
+#: yourls.php:76
+msgid "Submit"
+msgstr "Toepassen"
+
+#: yourls.php:92
+msgid "yourls Settings saved."
+msgstr "YourLS-instellingen bijgewerkt."
diff --git a/yourls/lang/nl/strings.php b/yourls/lang/nl/strings.php
new file mode 100644 (file)
index 0000000..e894de4
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+
+if(! function_exists("string_plural_select_nl")) {
+function string_plural_select_nl($n){
+       return ($n != 1);;
+}}
+;
+$a->strings["YourLS Settings"] = "YourLS-instellingen";
+$a->strings["URL: http://"] = "URL: http://";
+$a->strings["Username:"] = "Gebruikersnaam:";
+$a->strings["Password:"] = "Wachtwoord:";
+$a->strings["Use SSL "] = "Gebruik SSL";
+$a->strings["Submit"] = "Toepassen";
+$a->strings["yourls Settings saved."] = "YourLS-instellingen bijgewerkt.";
index beea2619c8f858e98195bcacca1fbf59934a4003..10155b95c0fdb26ac072f0e97a1669a61a2b968c 100644 (file)
@@ -1,28 +1,29 @@
 <?php
-
-
 /**
  * Name: Yourls
- * Description: Defines a YourLS url shortener for the Statusnet & Twitter plugins
+ * Description: Defines a YourLS url shortener for the Statusnet & Twitter addons
  * Version: 1.0
  * Author: Keith Fernie <http://friendika.me4.it/profile/keith>
- * 
+ * Status: Unsupported
  */
+use Friendica\Core\Addon;
+use Friendica\Core\Config;
+use Friendica\Core\L10n;
 
 function yourls_install() {
-       register_hook('plugin_settings', 'addon/yourls/yourls.php', 'yourls_addon_settings');
-       register_hook('plugin_settings_post', 'addon/yourls/yourls.php', 'yourls_addon_settings_post');
+       Addon::registerHook('addon_settings', 'addon/yourls/yourls.php', 'yourls_addon_settings');
+       Addon::registerHook('addon_settings_post', 'addon/yourls/yourls.php', 'yourls_addon_settings_post');
 
 }
 
 
 function yourls_uninstall() {
-       unregister_hook('plugin_settings', 'addon/yourls/yourls.php', 'yourls_addon_settings');
-       unregister_hook('plugin_settings_post', 'addon/yourls/yourls.php', 'yourls_addon_settings_post');
-       set_config('yourls','url1',trim($_POST['']));
-       set_config('yourls','username1',trim($_POST['']));
-       set_config('yourls','password1',trim($_POST['']));
-       set_config('yourls','ssl1',trim($_POST['']));
+       Addon::unregisterHook('addon_settings', 'addon/yourls/yourls.php', 'yourls_addon_settings');
+       Addon::unregisterHook('addon_settings_post', 'addon/yourls/yourls.php', 'yourls_addon_settings_post');
+       Config::set('yourls','url1',trim($_POST['']));
+       Config::set('yourls','username1',trim($_POST['']));
+       Config::set('yourls','password1',trim($_POST['']));
+       Config::set('yourls','ssl1',trim($_POST['']));
 
 }
 
@@ -52,34 +53,34 @@ function yourls_addon_settings(&$a,&$s) {
        $yourls_ssl = get_config('yourls', 'ssl1');
 
        $s .= '<span id="settings_yourls_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_yourls_expanded\'); openClose(\'settings_yourls_inflated\');">';
-       $s .= '<h3>' . t('YourLS') . '</h3>';
+       $s .= '<h3>' . L10n::t('YourLS') . '</h3>';
        $s .= '</span>';
        $s .= '<div id="settings_yourls_expanded" class="settings-block" style="display: none;">';
        $s .= '<span class="fakelink" onclick="openClose(\'settings_yourls_expanded\'); openClose(\'settings_yourls_inflated\');">';
-       $s .= '<h3>' . t('YourLS') . '</h3>';
+       $s .= '<h3>' . L10n::t('YourLS') . '</h3>';
        $s .= '</span>';
 
        $s .= '<div id="yourls-url-wrapper">';
-       $s .= '<label id="yourls-url-label" for="yourls-url">' . t('URL: http://') . '</label>';
+       $s .= '<label id="yourls-url-label" for="yourls-url">' . L10n::t('URL: http://') . '</label>';
        $s .= '<input id="yourls-url" type="text" name="yourls_url" value="' . $yourls_url .'" />';
        $s .= '</div><div class="clear"></div>';
 
        $s .= '<div id="yourls-username-wrapper">';
-       $s .= '<label id="yourls-username-label" for="yourls-username">' . t('Username:') . '</label>';
+       $s .= '<label id="yourls-username-label" for="yourls-username">' . L10n::t('Username:') . '</label>';
        $s .= '<input id="yourls-username" type="text" name="yourls_username" value="' . $yourls_username .'" />';
        $s .= '</div><div class="clear"></div>';
 
        $s .= '<div id="yourls-password-wrapper">';
-       $s .= '<label id="yourls-password-label" for="yourls-password">' . t('Password:') . '</label>';
+       $s .= '<label id="yourls-password-label" for="yourls-password">' . L10n::t('Password:') . '</label>';
        $s .= '<input id="yourls-password" type="password" name="yourls_password" value="' . $yourls_password .'" />';
        $s .= '</div><div class="clear"></div>';
 
        $s .= '<div id="yourls-ssl-wrapper">';
-       $s .= '<label id="yourls-ssl-label" for="yourls-ssl">' . t('Use SSL ') . '</label>';
+       $s .= '<label id="yourls-ssl-label" for="yourls-ssl">' . L10n::t('Use SSL ') . '</label>';
        $s .= '<input id="yourls-ssl" type="checkbox" name="yourls_ssl" value="1" ' . $ssl_checked . ' />';
        $s .= '</div><div class="clear"></div>';
 
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="yourls-submit" name="yourls-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
+       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="yourls-submit" name="yourls-submit" class="settings-submit" value="' . L10n::t('Save Settings') . '" /></div></div>';
 
        return;
 
@@ -91,10 +92,10 @@ function yourls_addon_settings_post(&$a,&$b) {
                return;
 
        if($_POST['yourls-submit']) {
-               set_config('yourls','url1',trim($_POST['yourls_url']));
-               set_config('yourls','username1',trim($_POST['yourls_username']));
-               set_config('yourls','password1',trim($_POST['yourls_password']));
-               set_config('yourls','ssl1',intval($_POST['yourls_ssl']));
-               info( t('yourls Settings saved.') . EOL);
+               Config::set('yourls','url1',trim($_POST['yourls_url']));
+               Config::set('yourls','username1',trim($_POST['yourls_username']));
+               Config::set('yourls','password1',trim($_POST['yourls_password']));
+               Config::set('yourls','ssl1',intval($_POST['yourls_ssl']));
+               info(L10n::t('yourls Settings saved.') . EOL);
        }
 }