cerberus 0.6 → 0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Authors.txt +4 -0
- data/Changelog.txt +11 -0
- data/Copyright.txt +16 -0
- data/Rakefile +16 -25
- data/Readme.markdown +1 -3
- data/bin/cerberus +5 -0
- data/lib/cerberus/builder/bjam.rb +1 -3
- data/lib/cerberus/builder/maven2.rb +0 -1
- data/lib/cerberus/builder/rake.rb +1 -1
- data/lib/cerberus/builder/rspec.rb +0 -1
- data/lib/cerberus/builder/ruby_base.rb +0 -1
- data/lib/cerberus/component_lazy_loader.rb +6 -2
- data/lib/cerberus/config.example.yml +1 -0
- data/lib/cerberus/constants.rb +2 -2
- data/lib/cerberus/manager.rb +7 -1
- data/lib/cerberus/publisher/mail.rb +4 -4
- data/lib/cerberus/publisher/twitter.rb +0 -1
- data/lib/cerberus/scm/base.rb +19 -0
- data/lib/cerberus/scm/bzr.rb +62 -0
- data/lib/cerberus/scm/cvs.rb +2 -7
- data/lib/cerberus/scm/darcs.rb +2 -11
- data/lib/cerberus/scm/git.rb +6 -14
- data/lib/cerberus/scm/perforce.rb +4 -4
- data/lib/cerberus/scm/svn.rb +2 -7
- data/lib/cerberus/utils.rb +5 -0
- data/lib/vendor/irc/README +23 -0
- data/lib/vendor/irc/lib/IRC.rb +164 -0
- data/lib/vendor/irc/lib/IRCChannel.rb +33 -0
- data/lib/vendor/irc/lib/IRCConnection.rb +134 -0
- data/lib/vendor/irc/lib/IRCEvent.rb +91 -0
- data/lib/vendor/irc/lib/IRCUser.rb +23 -0
- data/lib/vendor/irc/lib/IRCUtil.rb +49 -0
- data/lib/vendor/irc/lib/eventmap.yml +247 -0
- data/lib/vendor/twitter/CHANGES +129 -0
- data/lib/vendor/twitter/MIT-LICENSE +20 -0
- data/lib/vendor/twitter/README +37 -0
- data/lib/vendor/twitter/TODO +7 -0
- data/lib/vendor/twitter/lib/twitter.rb +34 -0
- data/lib/vendor/twitter/lib/twitter/client.rb +24 -0
- data/lib/vendor/twitter/lib/twitter/client/account.rb +24 -0
- data/lib/vendor/twitter/lib/twitter/client/auth.rb +27 -0
- data/lib/vendor/twitter/lib/twitter/client/base.rb +93 -0
- data/lib/vendor/twitter/lib/twitter/client/blocks.rb +35 -0
- data/lib/vendor/twitter/lib/twitter/client/favorites.rb +53 -0
- data/lib/vendor/twitter/lib/twitter/client/friendship.rb +35 -0
- data/lib/vendor/twitter/lib/twitter/client/graph.rb +37 -0
- data/lib/vendor/twitter/lib/twitter/client/messaging.rb +79 -0
- data/lib/vendor/twitter/lib/twitter/client/profile.rb +29 -0
- data/lib/vendor/twitter/lib/twitter/client/search.rb +27 -0
- data/lib/vendor/twitter/lib/twitter/client/status.rb +51 -0
- data/lib/vendor/twitter/lib/twitter/client/timeline.rb +72 -0
- data/lib/vendor/twitter/lib/twitter/client/user.rb +65 -0
- data/lib/vendor/twitter/lib/twitter/config.rb +77 -0
- data/lib/vendor/twitter/lib/twitter/console.rb +31 -0
- data/lib/vendor/twitter/lib/twitter/core.rb +137 -0
- data/lib/vendor/twitter/lib/twitter/ext.rb +2 -0
- data/lib/vendor/twitter/lib/twitter/ext/stdlib.rb +52 -0
- data/lib/vendor/twitter/lib/twitter/extras.rb +39 -0
- data/lib/vendor/twitter/lib/twitter/meta.rb +56 -0
- data/lib/vendor/twitter/lib/twitter/model.rb +360 -0
- data/lib/vendor/twitter/lib/twitter/version.rb +19 -0
- data/lib/vendor/twitter/spec/twitter/client/account_spec.rb +28 -0
- data/lib/vendor/twitter/spec/twitter/client/auth_spec.rb +34 -0
- data/lib/vendor/twitter/spec/twitter/client/base_spec.rb +242 -0
- data/lib/vendor/twitter/spec/twitter/client/blocks_spec.rb +76 -0
- data/lib/vendor/twitter/spec/twitter/client/favorites_spec.rb +183 -0
- data/lib/vendor/twitter/spec/twitter/client/friendship_spec.rb +76 -0
- data/lib/vendor/twitter/spec/twitter/client/graph_spec.rb +67 -0
- data/lib/vendor/twitter/spec/twitter/client/messaging_spec.rb +135 -0
- data/lib/vendor/twitter/spec/twitter/client/profile_spec.rb +91 -0
- data/lib/vendor/twitter/spec/twitter/client/search_spec.rb +68 -0
- data/lib/vendor/twitter/spec/twitter/client/status_spec.rb +119 -0
- data/lib/vendor/twitter/spec/twitter/client/timeline_spec.rb +79 -0
- data/lib/vendor/twitter/spec/twitter/client/user_spec.rb +203 -0
- data/lib/vendor/twitter/spec/twitter/client_spec.rb +2 -0
- data/lib/vendor/twitter/spec/twitter/config_spec.rb +86 -0
- data/lib/vendor/twitter/spec/twitter/console_spec.rb +15 -0
- data/lib/vendor/twitter/spec/twitter/core_spec.rb +127 -0
- data/lib/vendor/twitter/spec/twitter/ext/stdlib_spec.rb +59 -0
- data/lib/vendor/twitter/spec/twitter/extras_spec.rb +46 -0
- data/lib/vendor/twitter/spec/twitter/meta_spec.rb +90 -0
- data/lib/vendor/twitter/spec/twitter/model_spec.rb +508 -0
- data/lib/vendor/twitter/spec/twitter/version_spec.rb +19 -0
- data/lib/vendor/xmpp4r/CHANGELOG +83 -0
- data/lib/vendor/xmpp4r/COPYING +340 -0
- data/lib/vendor/xmpp4r/LICENSE +59 -0
- data/lib/vendor/xmpp4r/README.rdoc +110 -0
- data/lib/vendor/xmpp4r/README_ruby19.txt +43 -0
- data/lib/vendor/xmpp4r/Rakefile +262 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/README +56 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/adventure.rb +23 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/adventuremuc.rb +136 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/cube.xml +15 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/tower.xml +69 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/adventure/world.rb +424 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/fileserve.conf +11 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/fileserve.rb +346 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/getonline.rb +56 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/gtkmucclient.rb +315 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/migrate.rb +88 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/minimuc.rb +266 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/pep-aggregator/index.xsl +235 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/pep-aggregator/pep-aggregator.rb +147 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/recvfile.rb +84 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/rosterdiscovery.rb +129 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/sendfile.conf +10 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/sendfile.rb +72 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr.rb +51 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_jabber.rb +43 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/shellmgr/shellmgr_test.rb +10 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/versionpoll.rb +90 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/xmpping.rb +146 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/advanced/xmppingrc.sample +14 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/change_password.rb +41 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/client.rb +70 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/component.rb +11 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/echo.rb +37 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/jabbersend.rb +41 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/mass_sender.rb +68 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/muc_owner_config.rb +12 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/mucinfo.rb +41 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/mucsimplebot.rb +82 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/register.rb +42 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/remove_registration.rb +18 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/roster.rb +44 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/rosterprint.rb +50 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/rosterrename.rb +34 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/rosterwatch.rb +171 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/send_vcard.rb +67 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/tune_client.rb +56 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/tune_server.rb +58 -0
- data/lib/vendor/xmpp4r/data/doc/xmpp4r/examples/basic/versionbot.rb +75 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r.rb +116 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/base64.rb +32 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams.rb +15 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/filetransfer.rb +319 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/ibb/base.rb +257 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/ibb/initiator.rb +31 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/ibb/target.rb +47 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb +152 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb +86 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb +198 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb +65 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb +73 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb.orig +62 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/iq/bytestreams.rb +170 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/bytestreams/iq/si.rb +206 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/callbacks.rb +124 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/caps.rb +1 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/caps/c.rb +53 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/caps/helper/generator.rb +160 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/caps/helper/helper.rb +87 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/client.rb +317 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/command/helper/responder.rb +53 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/command/iq/command.rb +154 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/component.rb +103 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/connection.rb +219 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/dataforms.rb +5 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/dataforms/x/data.rb +297 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/debuglog.rb +42 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/delay.rb +5 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/delay/x/delay.rb +99 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/discovery.rb +7 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/discovery/helper/responder.rb +165 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/discovery/iq/discoinfo.rb +211 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/discovery/iq/discoitems.rb +147 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/errors.rb +281 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/feature_negotiation.rb +5 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/feature_negotiation/iq/feature.rb +28 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/framework/base.rb +55 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/framework/bot.rb +148 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/httpbinding.rb +5 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/httpbinding/client.rb +285 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/idgenerator.rb +37 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/iq.rb +221 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/jid.rb +167 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/message.rb +148 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc.rb +14 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/helper/mucbrowser.rb +92 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/helper/mucclient.rb +462 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/helper/simplemucclient.rb +332 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/iq/mucadmin.rb +23 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/iq/mucadminitem.rb +20 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/iq/mucowner.rb +15 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/item.rb +143 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/x/muc.rb +70 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/x/mucuserinvite.rb +60 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/muc/x/mucuseritem.rb +36 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/presence.rb +232 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub.rb +8 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/configuration.rb +86 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/event.rb +49 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/item.rb +35 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/items.rb +44 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/node_config.rb +48 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/publish.rb +24 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/subscription.rb +62 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/subscription_config.rb +67 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/children/unsubscribe.rb +48 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/helper/nodebrowser.rb +130 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/helper/nodehelper.rb +156 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/helper/servicehelper.rb +417 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/pubsub/iq/pubsub.rb +19 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/query.rb +15 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/rexmladdons.rb +151 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/roster.rb +7 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/roster/helper/roster.rb +519 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/roster/iq/roster.rb +215 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/roster/x/roster.rb +138 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/rpc.rb +2 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/rpc/helper/client.rb +123 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/rpc/helper/server.rb +74 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/rpc/helper/xmlrpcaddons.rb +67 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/rpc/iq/rpc.rb +23 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/sasl.rb +237 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/semaphore.rb +38 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/stream.rb +497 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/streamparser.rb +77 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/tune.rb +2 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/tune/helper/helper.rb +58 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/tune/tune.rb +113 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/vcard.rb +6 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/vcard/helper/vcard.rb +84 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/vcard/iq/vcard.rb +109 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/version.rb +7 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/version/helper/responder.rb +72 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/version/helper/simpleresponder.rb +44 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/version/iq/version.rb +105 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/x.rb +37 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/xhtml.rb +1 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/xhtml/html.rb +115 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/xmpp4r.rb +18 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/xmppelement.rb +168 -0
- data/lib/vendor/xmpp4r/lib/xmpp4r/xmppstanza.rb +162 -0
- data/lib/vendor/xmpp4r/setup.rb +1586 -0
- data/lib/vendor/xmpp4r/test/bytestreams/tc_ibb.rb +186 -0
- data/lib/vendor/xmpp4r/test/bytestreams/tc_socks5bytestreams.rb +113 -0
- data/lib/vendor/xmpp4r/test/caps/tc_helper.rb +156 -0
- data/lib/vendor/xmpp4r/test/dataforms/tc_data.rb +81 -0
- data/lib/vendor/xmpp4r/test/delay/tc_xdelay.rb +51 -0
- data/lib/vendor/xmpp4r/test/discovery/tc_responder.rb +91 -0
- data/lib/vendor/xmpp4r/test/lib/assert_equal_xml.rb +14 -0
- data/lib/vendor/xmpp4r/test/lib/clienttester.rb +120 -0
- data/lib/vendor/xmpp4r/test/muc/tc_muc_mucclient.rb +830 -0
- data/lib/vendor/xmpp4r/test/muc/tc_muc_simplemucclient.rb +114 -0
- data/lib/vendor/xmpp4r/test/muc/tc_mucowner.rb +50 -0
- data/lib/vendor/xmpp4r/test/pubsub/tc_helper.rb +662 -0
- data/lib/vendor/xmpp4r/test/pubsub/tc_nodeconfig.rb +54 -0
- data/lib/vendor/xmpp4r/test/pubsub/tc_subscriptionconfig.rb +41 -0
- data/lib/vendor/xmpp4r/test/roster/tc_helper.rb +514 -0
- data/lib/vendor/xmpp4r/test/roster/tc_iqqueryroster.rb +173 -0
- data/lib/vendor/xmpp4r/test/roster/tc_xroster.rb +73 -0
- data/lib/vendor/xmpp4r/test/rpc/tc_helper.rb +96 -0
- data/lib/vendor/xmpp4r/test/tc_callbacks.rb +129 -0
- data/lib/vendor/xmpp4r/test/tc_class_names.rb +146 -0
- data/lib/vendor/xmpp4r/test/tc_client.rb +30 -0
- data/lib/vendor/xmpp4r/test/tc_errors.rb +146 -0
- data/lib/vendor/xmpp4r/test/tc_idgenerator.rb +30 -0
- data/lib/vendor/xmpp4r/test/tc_iq.rb +113 -0
- data/lib/vendor/xmpp4r/test/tc_iqquery.rb +31 -0
- data/lib/vendor/xmpp4r/test/tc_jid.rb +204 -0
- data/lib/vendor/xmpp4r/test/tc_message.rb +116 -0
- data/lib/vendor/xmpp4r/test/tc_presence.rb +150 -0
- data/lib/vendor/xmpp4r/test/tc_rexml.rb +139 -0
- data/lib/vendor/xmpp4r/test/tc_stream.rb +229 -0
- data/lib/vendor/xmpp4r/test/tc_streamComponent.rb +95 -0
- data/lib/vendor/xmpp4r/test/tc_streamError.rb +131 -0
- data/lib/vendor/xmpp4r/test/tc_streamSend.rb +59 -0
- data/lib/vendor/xmpp4r/test/tc_streamparser.rb +112 -0
- data/lib/vendor/xmpp4r/test/tc_xmppstanza.rb +135 -0
- data/lib/vendor/xmpp4r/test/ts_xmpp4r.rb +53 -0
- data/lib/vendor/xmpp4r/test/tune/tc_helper_recv.rb +84 -0
- data/lib/vendor/xmpp4r/test/tune/tc_helper_send.rb +74 -0
- data/lib/vendor/xmpp4r/test/tune/tc_tune.rb +79 -0
- data/lib/vendor/xmpp4r/test/vcard/tc_helper.rb +49 -0
- data/lib/vendor/xmpp4r/test/vcard/tc_iqvcard.rb +62 -0
- data/lib/vendor/xmpp4r/test/version/tc_helper.rb +60 -0
- data/lib/vendor/xmpp4r/test/version/tc_iqqueryversion.rb +97 -0
- data/lib/vendor/xmpp4r/test/xhtml/tc_html.rb +41 -0
- data/lib/vendor/xmpp4r/tools/gen_requires.bash +31 -0
- data/lib/vendor/xmpp4r/tools/xmpp4r-gemspec-test.rb +11 -0
- data/lib/vendor/xmpp4r/xmpp4r.gemspec +291 -0
- data/test/jabber_publisher_test.rb +1 -1
- data/test/mail_publisher_test.rb +2 -2
- data/test/mock/twitter.rb +0 -1
- data/test/rspec_builder_test.rb +39 -2
- data/test/rss_publisher_test.rb +1 -1
- data/test/twitter_publisher_test.rb +1 -1
- metadata +268 -53
- data/lib/cerberus/publisher/gmailer.rb +0 -17
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# =XMPP4R - XMPP Library for Ruby
|
|
2
|
+
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
|
|
3
|
+
# Website::http://home.gna.org/xmpp4r/
|
|
4
|
+
|
|
5
|
+
require 'xmpp4r/muc/x/mucuseritem'
|
|
6
|
+
require 'xmpp4r/muc/x/mucuserinvite'
|
|
7
|
+
|
|
8
|
+
module Jabber
|
|
9
|
+
module MUC
|
|
10
|
+
##
|
|
11
|
+
# Class for <x/> elements
|
|
12
|
+
# with namespace http://jabber.org/protocol/muc
|
|
13
|
+
#
|
|
14
|
+
# See JEP-0045 for details
|
|
15
|
+
class XMUC < X
|
|
16
|
+
name_xmlns 'x', 'http://jabber.org/protocol/muc'
|
|
17
|
+
|
|
18
|
+
##
|
|
19
|
+
# Text content of the <tt><password/></tt> element
|
|
20
|
+
def password
|
|
21
|
+
first_element_text('password')
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
##
|
|
25
|
+
# Set the password for joining a room
|
|
26
|
+
# (text content of the <tt><password/></tt> element)
|
|
27
|
+
def password=(s)
|
|
28
|
+
if s
|
|
29
|
+
replace_element_text('password', s)
|
|
30
|
+
else
|
|
31
|
+
delete_elements('password')
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
##
|
|
37
|
+
# Class for <x/> elements
|
|
38
|
+
# with namespace http://jabber.org/protocol/muc#user
|
|
39
|
+
#
|
|
40
|
+
# See JEP-0058 for details
|
|
41
|
+
class XMUCUser < X
|
|
42
|
+
name_xmlns 'x', 'http://jabber.org/protocol/muc#user'
|
|
43
|
+
|
|
44
|
+
##
|
|
45
|
+
# Retrieve the three-digit code in
|
|
46
|
+
# <tt><x xmlns='http://jabber.org/protocol/muc#user'><status code='...'/></x></tt>
|
|
47
|
+
# result:: [Fixnum] or nil
|
|
48
|
+
def status_code
|
|
49
|
+
e = nil
|
|
50
|
+
each_element('status') { |xe| e = xe }
|
|
51
|
+
if e and e.attributes['code'].size == 3 and e.attributes['code'].to_i != 0
|
|
52
|
+
e.attributes['code'].to_i
|
|
53
|
+
else
|
|
54
|
+
nil
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
##
|
|
59
|
+
# Get all <item/> elements
|
|
60
|
+
# result:: [Array] of [XMUCUserItem]
|
|
61
|
+
def items
|
|
62
|
+
res = []
|
|
63
|
+
each_element('item') { |item|
|
|
64
|
+
res << item
|
|
65
|
+
}
|
|
66
|
+
res
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# =XMPP4R - XMPP Library for Ruby
|
|
2
|
+
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
|
|
3
|
+
# Website::http://home.gna.org/xmpp4r/
|
|
4
|
+
|
|
5
|
+
module Jabber
|
|
6
|
+
module MUC
|
|
7
|
+
class XMUCUserInvite < XMPPElement
|
|
8
|
+
name_xmlns 'invite', 'http://jabber.org/protocol/muc#user'
|
|
9
|
+
|
|
10
|
+
def initialize(to=nil, reason=nil)
|
|
11
|
+
super()
|
|
12
|
+
set_to(to)
|
|
13
|
+
set_reason(reason)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def to
|
|
17
|
+
attributes['to'].nil? ? nil : JID.new(attributes['to'])
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def to=(j)
|
|
21
|
+
attributes['to'] = j.nil? ? nil : j.to_s
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def set_to(j)
|
|
25
|
+
self.to = j
|
|
26
|
+
self
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def from
|
|
30
|
+
attributes['from'].nil? ? nil : JID.new(attributes['from'])
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def from=(j)
|
|
34
|
+
attributes['from'] = (j.nil? ? nil : j.to_s)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def set_from(j)
|
|
38
|
+
self.from = j
|
|
39
|
+
self
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def reason
|
|
43
|
+
first_element_text('reason')
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def reason=(s)
|
|
47
|
+
if s
|
|
48
|
+
replace_element_text('reason', s)
|
|
49
|
+
else
|
|
50
|
+
delete_elements('reason')
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def set_reason(s)
|
|
55
|
+
self.reason = s
|
|
56
|
+
self
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# =XMPP4R - XMPP Library for Ruby
|
|
2
|
+
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
|
|
3
|
+
# Website::http://home.gna.org/xmpp4r/
|
|
4
|
+
|
|
5
|
+
require 'xmpp4r/muc/item'
|
|
6
|
+
|
|
7
|
+
module Jabber
|
|
8
|
+
module MUC
|
|
9
|
+
class XMUCUserItem < MUC::UserItem
|
|
10
|
+
name_xmlns 'item', 'http://jabber.org/protocol/muc#user'
|
|
11
|
+
|
|
12
|
+
def initialize(affiliation=nil, role=nil, jid=nil)
|
|
13
|
+
super()
|
|
14
|
+
set_affiliation(affiliation)
|
|
15
|
+
set_role(role)
|
|
16
|
+
set_jid(jid)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def continue
|
|
20
|
+
c = nil
|
|
21
|
+
each_element('continue') { |xe| c = xe }
|
|
22
|
+
c.nil?
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def continue=(c)
|
|
26
|
+
delete_elements('continue')
|
|
27
|
+
add_element('continue') if c
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def set_continue(c)
|
|
31
|
+
self.continue = c
|
|
32
|
+
self
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# =XMPP4R - XMPP Library for Ruby
|
|
2
|
+
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
|
|
3
|
+
# Website::http://home.gna.org/xmpp4r/
|
|
4
|
+
|
|
5
|
+
require 'xmpp4r/xmppstanza'
|
|
6
|
+
require 'xmpp4r/x'
|
|
7
|
+
|
|
8
|
+
module Jabber
|
|
9
|
+
##
|
|
10
|
+
# The presence class is used to construct presence messages to
|
|
11
|
+
# send to the Jabber service.
|
|
12
|
+
class Presence < XMPPStanza
|
|
13
|
+
name_xmlns 'presence', 'jabber:client'
|
|
14
|
+
force_xmlns true
|
|
15
|
+
|
|
16
|
+
include Comparable
|
|
17
|
+
include XParent
|
|
18
|
+
|
|
19
|
+
##
|
|
20
|
+
# Create presence stanza
|
|
21
|
+
# show:: [String] Initial Availability Status
|
|
22
|
+
# status:: [String] Initial status message
|
|
23
|
+
# priority:: [Fixnum] Initial priority value
|
|
24
|
+
def initialize(show=nil, status=nil, priority=nil)
|
|
25
|
+
super()
|
|
26
|
+
set_show(show) if show
|
|
27
|
+
set_status(status) if status
|
|
28
|
+
set_priority(priority) if priority
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
##
|
|
32
|
+
# Get type of presence
|
|
33
|
+
#
|
|
34
|
+
# result:: [Symbol] or [Nil] Possible values are:
|
|
35
|
+
# * :error
|
|
36
|
+
# * :probe (Servers send this to request presence information)
|
|
37
|
+
# * :subscribe (Subscription request)
|
|
38
|
+
# * :subscribed (Subscription approval)
|
|
39
|
+
# * :unavailable (User has gone offline)
|
|
40
|
+
# * :unsubscribe (Unsubscription request)
|
|
41
|
+
# * :unsubscribed (Unsubscription approval)
|
|
42
|
+
# * [nil] (available)
|
|
43
|
+
# See RFC3921 - 2.2.1. for explanation.
|
|
44
|
+
def type
|
|
45
|
+
case super
|
|
46
|
+
when 'error' then :error
|
|
47
|
+
when 'probe' then :probe
|
|
48
|
+
when 'subscribe' then :subscribe
|
|
49
|
+
when 'subscribed' then :subscribed
|
|
50
|
+
when 'unavailable' then :unavailable
|
|
51
|
+
when 'unsubscribe' then :unsubscribe
|
|
52
|
+
when 'unsubscribed' then :unsubscribed
|
|
53
|
+
else nil
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
##
|
|
58
|
+
# Set type of presence
|
|
59
|
+
# val:: [Symbol] See type for possible subscription types
|
|
60
|
+
def type=(val)
|
|
61
|
+
case val
|
|
62
|
+
when :error then super('error')
|
|
63
|
+
when :probe then super('probe')
|
|
64
|
+
when :subscribe then super('subscribe')
|
|
65
|
+
when :subscribed then super('subscribed')
|
|
66
|
+
when :unavailable then super('unavailable')
|
|
67
|
+
when :unsubscribe then super('unsubscribe')
|
|
68
|
+
when :unsubscribed then super('unsubscribed')
|
|
69
|
+
else super(nil)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
##
|
|
74
|
+
# Set type of presence (chaining-friendly)
|
|
75
|
+
# val:: [Symbol] See type for possible subscription types
|
|
76
|
+
def set_type(val)
|
|
77
|
+
self.type = val
|
|
78
|
+
self
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
##
|
|
82
|
+
# Get Availability Status (RFC3921 - 5.2)
|
|
83
|
+
# result:: [Symbol] or [Nil] Valid values according to RFC3921:
|
|
84
|
+
# * nil (Available, no <show/> element)
|
|
85
|
+
# * :away
|
|
86
|
+
# * :chat (Free for chat)
|
|
87
|
+
# * :dnd (Do not disturb)
|
|
88
|
+
# * :xa (Extended away)
|
|
89
|
+
def show
|
|
90
|
+
e = first_element('show')
|
|
91
|
+
text = e ? e.text : nil
|
|
92
|
+
case text
|
|
93
|
+
when 'away' then :away
|
|
94
|
+
when 'chat' then :chat
|
|
95
|
+
when 'dnd' then :dnd
|
|
96
|
+
when 'xa' then :xa
|
|
97
|
+
else nil
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
##
|
|
102
|
+
# Set Availability Status
|
|
103
|
+
# val:: [Symbol] or [Nil] See show for explanation
|
|
104
|
+
def show=(val)
|
|
105
|
+
xe = first_element('show')
|
|
106
|
+
if xe.nil?
|
|
107
|
+
xe = add_element('show')
|
|
108
|
+
end
|
|
109
|
+
case val
|
|
110
|
+
when String then raise "Invalid value for show."
|
|
111
|
+
when :away then text = 'away'
|
|
112
|
+
when :chat then text = 'chat'
|
|
113
|
+
when :dnd then text = 'dnd'
|
|
114
|
+
when :xa then text = 'xa'
|
|
115
|
+
when nil then text = nil
|
|
116
|
+
else raise "Invalid value for show."
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
if text.nil?
|
|
120
|
+
delete_element(xe)
|
|
121
|
+
else
|
|
122
|
+
xe.text = text
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
##
|
|
127
|
+
# Set Availability Status (chaining-friendly)
|
|
128
|
+
# val:: [Symbol] or [Nil] See show for explanation
|
|
129
|
+
def set_show(val)
|
|
130
|
+
self.show = val
|
|
131
|
+
self
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
##
|
|
135
|
+
# Get status message
|
|
136
|
+
# result:: [String] or nil
|
|
137
|
+
def status
|
|
138
|
+
first_element_text('status')
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
##
|
|
142
|
+
# Set status message
|
|
143
|
+
# val:: [String] or nil
|
|
144
|
+
def status=(val)
|
|
145
|
+
if val.nil?
|
|
146
|
+
delete_element('status')
|
|
147
|
+
else
|
|
148
|
+
replace_element_text('status', val)
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
##
|
|
153
|
+
# Set status message (chaining-friendly)
|
|
154
|
+
# val:: [String] or nil
|
|
155
|
+
def set_status(val)
|
|
156
|
+
self.status = val
|
|
157
|
+
self
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
##
|
|
161
|
+
# Get presence priority, or nil if absent
|
|
162
|
+
# result:: [Integer]
|
|
163
|
+
def priority
|
|
164
|
+
e = first_element_text('priority')
|
|
165
|
+
if e
|
|
166
|
+
return e.to_i
|
|
167
|
+
else
|
|
168
|
+
return nil
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
##
|
|
173
|
+
# Set presence priority
|
|
174
|
+
# val:: [Integer] Priority value between -128 and +127
|
|
175
|
+
#
|
|
176
|
+
# *Warning:* negative values make you receive no subscription requests etc.
|
|
177
|
+
# (RFC3921 - 2.2.2.3.)
|
|
178
|
+
def priority=(val)
|
|
179
|
+
if val.nil?
|
|
180
|
+
delete_element('priority')
|
|
181
|
+
else
|
|
182
|
+
replace_element_text('priority', val)
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
##
|
|
187
|
+
# Set presence priority (chaining-friendly)
|
|
188
|
+
# val:: [Integer] Priority value between -128 and +127
|
|
189
|
+
def set_priority(val)
|
|
190
|
+
self.priority = val
|
|
191
|
+
self
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
##
|
|
195
|
+
# Compare two presences using priority
|
|
196
|
+
# (with cmp_interest as fall-back).
|
|
197
|
+
def <=>(o)
|
|
198
|
+
if priority.to_i == o.priority.to_i
|
|
199
|
+
cmp_interest(o)
|
|
200
|
+
else
|
|
201
|
+
priority.to_i <=> o.priority.to_i
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
##
|
|
206
|
+
# Compare two presences. The most suitable to talk with is the
|
|
207
|
+
# biggest.
|
|
208
|
+
PRESENCE_STATUS = { :chat => 4,
|
|
209
|
+
nil => 3,
|
|
210
|
+
:dnd => 2,
|
|
211
|
+
:away => 1,
|
|
212
|
+
:xa => 0,
|
|
213
|
+
:unavailable => -1,
|
|
214
|
+
:error => -2 }
|
|
215
|
+
def cmp_interest(o)
|
|
216
|
+
if type.nil?
|
|
217
|
+
if o.type.nil?
|
|
218
|
+
# both available.
|
|
219
|
+
PRESENCE_STATUS[show] <=> PRESENCE_STATUS[o.show]
|
|
220
|
+
else
|
|
221
|
+
return -1
|
|
222
|
+
end
|
|
223
|
+
elsif o.type.nil?
|
|
224
|
+
return 1
|
|
225
|
+
else
|
|
226
|
+
# both are non-nil. We consider this is equal.
|
|
227
|
+
return 0
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
end
|
|
232
|
+
end
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
require 'xmpp4r/pubsub/iq/pubsub'
|
|
2
|
+
require 'xmpp4r/pubsub/children/event'
|
|
3
|
+
require 'xmpp4r/pubsub/children/item'
|
|
4
|
+
require 'xmpp4r/pubsub/children/items'
|
|
5
|
+
require 'xmpp4r/pubsub/children/publish'
|
|
6
|
+
require 'xmpp4r/pubsub/children/subscription'
|
|
7
|
+
require 'xmpp4r/pubsub/children/unsubscribe'
|
|
8
|
+
require 'xmpp4r/pubsub/helper/servicehelper'
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# =XMPP4R - XMPP Library for Ruby
|
|
2
|
+
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
|
|
3
|
+
# Website::http://home.gna.org/xmpp4r/
|
|
4
|
+
|
|
5
|
+
require 'xmpp4r/xmppelement'
|
|
6
|
+
require 'xmpp4r/pubsub/iq/pubsub'
|
|
7
|
+
|
|
8
|
+
module Jabber
|
|
9
|
+
module PubSub
|
|
10
|
+
|
|
11
|
+
class Configuration < XMPPElement
|
|
12
|
+
##
|
|
13
|
+
# get the underlying XData form element
|
|
14
|
+
def form
|
|
15
|
+
children.each do |c|
|
|
16
|
+
return c if c.kind_of?(Jabber::Dataforms::XData)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
nil
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def form=(form)
|
|
23
|
+
children.each do |c|
|
|
24
|
+
delete_element(c)
|
|
25
|
+
if c.kind_of?(Jabber::Dataforms::XData)
|
|
26
|
+
delete(c)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
add(form)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Implemented by NodeConfig and SubscriptionConfig
|
|
33
|
+
def form_type
|
|
34
|
+
''
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def options=(options)
|
|
38
|
+
if options
|
|
39
|
+
self.form = form_for_options( form_type, options )
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
##
|
|
44
|
+
# get a list of the configured options represented by this stanza
|
|
45
|
+
# return:: [Hash] the options and their values
|
|
46
|
+
def options
|
|
47
|
+
configured_options = {}
|
|
48
|
+
|
|
49
|
+
if !form.nil?
|
|
50
|
+
form.fields.each do |f|
|
|
51
|
+
f.values.size == 1 ? configured_options[f.var] = f.values.first : configured_options[f.var] = f.values
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
configured_options
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def node=(node)
|
|
59
|
+
attributes['node'] = node
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def node
|
|
63
|
+
attributes['node']
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
private
|
|
67
|
+
|
|
68
|
+
##
|
|
69
|
+
# creates a Dataform for configuration
|
|
70
|
+
# config:: [Hash] the desired configuration options
|
|
71
|
+
def form_for_options(type, options)
|
|
72
|
+
form = Jabber::Dataforms::XData.new(:submit)
|
|
73
|
+
pubsub_config = Jabber::Dataforms::XDataField.new('FORM_TYPE', :hidden)
|
|
74
|
+
pubsub_config.values = [type]
|
|
75
|
+
form.add(pubsub_config)
|
|
76
|
+
options.each_pair do |key, value|
|
|
77
|
+
f = Jabber::Dataforms::XDataField.new(key)
|
|
78
|
+
f.values = [value]
|
|
79
|
+
form.add(f)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
form
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|